1. 數組概述
Go語言中
字符串
數組
切片
這三種數據類型在底層原始數據有着相同的內存結構,在上層因爲語法的限制而有着不同的行爲表象.
數組是用來存放同一類型數據的並且具有固定長度的連續內存區域,使用時可以修改數組成員,但是不能改變數組的長度.數組是一種數據類型,在Go語言是中數組是值類型.
- 數組的長度是固定的
- 數組中的元素類型一定是一致的
- 數組長度是數組類型的組成部分,故不同長度和元素類型的數組是不同的類型
- 理解數組是理解切片的基礎
- Go語言中數組是值語義,一個數組變量表示整個數組
當需要詳細規劃程序所使用的內存時,數組類型非常有用, 使用數組值可以避免耗時費力的內存二次分配操作
package main
import "fmt"
func main() {
var week = [8]string{"_", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}
L := len(week)
for i := 0; i < L; i++ {
// 觀察輸出的各個數組元素的內存地址
fmt.Println(&week[i])
}
}
$ go run main.go
0xc000084000
0xc000084010
0xc000084020
0xc000084030
0xc000084040
0xc000084050
0xc000084060
0xc000084070
2. 數組聲明
數組的聲明寫法如下 :
var 數組名 [數組長度]T
- 數組名 : 就是數組在使用的時候的變量名
- 數組長度 : 數組定義時,最多允許的存入數組的元素的數量,可以是一個表達式,在程序編譯期計算的結果必須是一個整數,在使用前這個值是已經確定的
- T : 表示一種數據類型, 數組的類型可以是數組,這樣就構成了多維數組
- 長度爲0的數組在內存中不佔用空間
package main
import "fmt"
const N = 2
func main() {
var nArr [3]int
var sArr [7]string
var fArr [10]float64
var hArr [5][1]string
var ageArr [N * 5]int
fmt.Println(nArr)
fmt.Println(sArr)
fmt.Println(fArr)
fmt.Println(hArr)
fmt.Println(ageArr)
}
$ go run main.go
[0 0 0]
[ ]
[0 0 0 0 0 0 0 0 0 0]
[[] [] [] [] []]
[0 0 0 0 0 0 0 0 0 0]
3. 數組初始化
數組初始化就是給數組填充一些數據
方式1:
數組在聲明是使用初始化列表進行元素設置
這種數組初始化,列表元素的個數可以比數組長度少,但是不能超過數組長度
package main
import "fmt"
func main() {
var week = [8]string{"_", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}
fmt.Println(week)
}
方式2:
在編譯器編譯的時候,由編譯器根據數組元素個數自動設置數長度
[...]
方括號中的...
表示有Go編譯器計算該值的元素數量並以此獲取其長度
package main
import "fmt"
func main() {
var workDay = [...]string{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"}
fmt.Println(workDay)
var nArr = [...]int{0:9,15:900}
fmt.Println(nArr)
}
$ go run main.go
[Monday Tuesday Wednesday Thursday Friday]
[9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 900]
方式3:
一般方法, 先聲明,後定義
package main
import "fmt"
func main() {
var NS [3][1]string
NS[0][0] = "aa"
NS[1][0] = "bb"
NS[2][0] = "cc"
fmt.Println(NS)
}
4. 數組遍歷
通常數組遍歷就是訪問數組中的每一個元素
方法一 for 循環遍歷
package main
import "fmt"
func main() {
var week = [8]string{"_", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}
L := len(week)
for i:=0; i<L;i++ {
fmt.Println(i,"----",week[i])
}
}
$ go run main.go
0 ---- _
1 ---- Monday
2 ---- Tuesday
3 ---- Wednesday
4 ---- Thursday
5 ---- Friday
6 ---- Saturday
7 ---- Sunday
方法二 for range 結構遍歷
package main
import (
"fmt"
)
func main() {
var week = [8]string{"_", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}
// k 表示數組下標 , v表示元素值
for k,v := range week{
fmt.Println(k,"===",v)
}
}
$ go run main.go
0 === _
1 === Monday
2 === Tuesday
3 === Wednesday
4 === Thursday
5 === Friday
6 === Saturday
7 === Sunday
5. 數組使用說明
- 數組聲明之後,沒有初始化數組中的元素的值都是默認值
- 數組長度不能動態變化
- 數組的下標都是從0開始的
- 數組下標使用不能超過數組的長度否則數組越界,程序報錯
- 數組屬於值類型,默認是值傳遞,拷貝的副本,值修改相互不影響
- 在不同的函數之間,想修改原數組,可以使用引用傳遞
package main
import "fmt"
func modify(arr [8]string){
arr[0] = "DEMO"
fmt.Println(arr)
}
func main(){
var week = [8]string{"_", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}
modify(week)
fmt.Println(week)
}
$go run main.go
[DEMO Monday Tuesday Wednesday Thursday Friday Saturday Sunday]
[_ Monday Tuesday Wednesday Thursday Friday Saturday Sunday]
引用傳遞
package main
import (
"fmt"
)
func modify(arr [8]string){
arr[0] = "DEMO"
fmt.Println(arr)
}
func modifyCite(arr *[8]string){
arr[1] = "星期一"
}
func main(){
var week = [8]string{"_", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}
modify(week)
// 引用傳遞
modifyCite(&week)
fmt.Println(week)
}
$ go run main.go
[DEMO Monday Tuesday Wednesday Thursday Friday Saturday Sunday]
[_ 星期一 Tuesday Wednesday Thursday Friday Saturday Sunday]
練習Demo
package main
import (
"fmt"
)
func main() {
// 打印26字母
var char [26]byte
for i := 0; i < 26; i++ {
char[i] = 'A' + byte(i)
}
for _, v := range char {
fmt.Printf("%c\t", v)
}
//求一個數組中的最大值
var n = [...]int{1, 9, -90, 88, 99, 8776, 23}
maxIndex := 0
maxValue := n[maxIndex]
for k, v := range n {
if v > maxValue {
maxValue = v
maxIndex = k
}
}
fmt.Printf("\n數組n中最大值是%d,其下標是%d", maxValue, maxIndex)
// 求出數組的平均值 數組元素值總和/ 元素個數
L := len(n)
sum := 0
for i := 0; i < L; i++ {
sum += n[i]
}
aver := float64(sum / L)
fmt.Printf("\n數組n有%d個元素,平均值是%f", L, aver)
}
$ go run main.go
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
數組n中最大值是8776,其下標是5
數組n有7個元素,平均值是1272.000000