本篇內(nèi)容介紹了“Go語言的數(shù)組怎么用”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)客戶idc服務(wù)中心,提供內(nèi)蒙古服務(wù)器托管、成都服務(wù)器、成都主機托管、成都雙線服務(wù)器等業(yè)務(wù)的一站式服務(wù)。通過各地的服務(wù)中心,我們向成都用戶提供優(yōu)質(zhì)廉價的產(chǎn)品以及開放、透明、穩(wěn)定、高性價比的服務(wù),資深網(wǎng)絡(luò)工程師在機房提供7*24小時標(biāo)準(zhǔn)級技術(shù)保障。我們先試一下只申明類型,不賦初值。這時編譯器會給數(shù)組默認(rèn)賦上「零值」。數(shù)組的零值就是所有內(nèi)部元素的零值。
package main
import "fmt"
func main() {
var a [9]int
fmt.Println(a)
}
------------
[0 0 0 0 0 0 0 0 0]
下面我們看看另外三種變量定義的形式, 效果都是一樣的
package main
import "fmt"
func main() {
var a = [9]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
var b [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
c := [8]int{1, 2, 3, 4, 5, 6, 7, 8}
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
}
---------------------
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9 10]
[1 2 3 4 5 6 7 8]
接下來我們使用下標(biāo)來簡單操作一下數(shù)組,這個數(shù)組里存的是數(shù)字的平方值
package main
import "fmt"
func main() {
var squares [9]int
for i := 0; i < len(squares); i++ {
squares[i] = (i + 1) * (i + 1)
}
fmt.Println(squares)
}
--------------------
[1 4 9 16 25 36 49 64 81]
上面的代碼中我們注意到可以使用內(nèi)置函數(shù) len() 來直接獲取數(shù)組的長度。數(shù)組的長度是編譯期確定的,當(dāng)我們使用 len() 函數(shù)訪問數(shù)組的長度屬性時,編譯器在背后偷偷把它替換成了整數(shù)值。
package main
import "fmt"
func main() {
var a = [5]int{1,2,3,4,5}
a[101] = 255
fmt.Println(a)
}
-----
./main.go:7:3: invalid array index 101 (out of bounds for 5-element array)
上面的代碼運行結(jié)果說明了 Go 語言會對數(shù)組訪問下標(biāo)越界進行編譯器檢查。有一個重要的問題是,如果下標(biāo)是一個變量,Go 是如何檢查下標(biāo)越界呢?變量需要在運行時才可以決定是否越界,Go 是如何辦到的呢?
package main
import "fmt"
func main() {
var a = [5]int{1,2,3,4,5}
var b = 101
a[b] = 255
fmt.Println(a)
}
------------
panic: runtime error: index out of range
goroutine 1 [running]:
main.main()
/Users/qianwp/go/src/github.com/pyloque/practice/main.go:8 +0x3d
exit status 2
答案是 Go 會在編譯后的代碼中插入下標(biāo)越界檢查的邏輯,所以數(shù)組的下標(biāo)訪問效率是要打折扣的,比不得 C 語言的數(shù)組訪問性能。
同樣的子元素類型并且是同樣長度的數(shù)組才可以相互賦值,否則就是不同的數(shù)組類型,不能賦值。數(shù)組的賦值本質(zhì)上是一種淺拷貝操作,賦值的兩個數(shù)組變量的值不會共享。
package main
import "fmt"
func main() {
var a = [9]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
var b [9]int
b = a
a[0] = 12345
fmt.Println(a)
fmt.Println(b)
}
--------------------------
[12345 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
從上面代碼的運行結(jié)果中可以看出賦值后兩個數(shù)組并沒有共享內(nèi)部元素。如果數(shù)組的長度很大,那么拷貝操作是有一定的開銷的,使用的時候一定需要注意。下面我們嘗試使用不同長度的數(shù)組賦值會有什么結(jié)果
package main
import "fmt"
func main() {
var a = [9]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
var b [10]int
b = a
fmt.Println(b)
}
--------------------------
./main.go:8:4: cannot use a (type [9]int) as type [10]int in assignment
可以看出不同長度的數(shù)組之間賦值是禁止的,因為它們屬于不同的類型。
數(shù)組除了可以使用下標(biāo)進行遍歷之外,還可以使用 range 關(guān)鍵字來遍歷,range 遍歷提供了下面兩種形式。
package main
import "fmt"
func main() {
var a = [5]int{1,2,3,4,5}
for index := range a {
fmt.Println(index, a[index])
}
for index, value := range a {
fmt.Println(index, value)
}
}
------------
0 1
1 2
2 3
3 4
4 5
0 1
1 2
2 3
3 4
4 5
“Go語言的數(shù)組怎么用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!