一 數組(array)
go語言中的數組是固定長度的。使用前必須指定數組長度。
go語言中數組是值類型。如果將數組賦值給另一個數組或者方法中參數使用都是復制一份,方法中使用可以使用指針傳遞地址。
聲明:
var arrayName = [arraySize]dataType{xxx,xxx,xxx....} //定義全局數組
例如:var b = [10]int{1,2,3,4,5,6,7,8,9,0}
var b = [10]int{1,2,3,4} //不足自動補0
arr := [...]int{1,2,3,4,5}
//循環 for _,i := range arr { fmt.Println(i) }
多維數組:
//初始化: var a = [3][4]int{[4]int{1,2,3},[4]int{1,2,3},[4]int{1,2}} //不足補0
//創建數組聲明changdu var aaa1 = [5]int{1,2,3,4} fmt.Println(aaa1) //創建數組不聲明長度 var aaa2 = [...]int{1111,2222,3333,4444,55555,6666} fmt.Println(aaa2) //創建數組並初始化其中部分 var aaa3 = [5]string{1:"aaa",2:"bbb"} fmt.Println(aaa3)
切片(slice)
指向底層數組的指針。不需要定義長度。和數組在寫法上的區別就是不需要指定長度
對比:
v := [2]string{"123","123"} //數組 v := []string{"123","123"} //切片
默念:數組有長度,切片沒長度,數組有長度,切片沒長度......
如果多個slice指向同一個底層數組,其中一個改變了數組的值,則其他如果包括這個key的值也會改變
如果slice增加時,導致數組超長,則會再次分配一個新的數組。其他slice可能就會指向這個新的底層數組,這個前一個改變了底層數組的值可能是第一個底層數組,所以第二個slice的key 指向的是第二個底層數組。這點有點混淆。來自無聞視頻教程中講解。
方法:
append(arr,1,2,3,4,5) //將1,2,3,4,5追加到arr中 slice := arr[開始:結束] //指向數組中開始到結束的 copy(arr1,arr2) //用arr2中的值替代arr1中的值,通過key 對應的代替 copy(arr1[開始:結束],arr2[開始:結束]) 指定替換部位
map:
是一個key=>value的hash結構
key是除func、slice、map、array外的類型
聲明初始化 m := map[string]string{}
賦值一個 m["key1"] = "val1"
取值 v := m["key1"]
刪除一個值 d := delete(m,"key1")
取值的時候可以返回兩個值。另一個可以判斷是否存在
val,isset := m[2]
struct(結構體)
個人理解:一種類型;
例如:
type person{
Name string
ages int
}
使用該類型需要定義該類型中兩個屬性
所有值傳遞不會改變內存中的值,只有引用類型該可以改變內存中的值
內建函數 make 用來為 slice,map 或 chan 類型分配內存和初始化一個對象(注意:只能用在這三種類型上),第一個參數也是一個類型而不是一個值
func make(t Type,size IntegerType) Type
make slice
var slice_ []int = make([]int,5,10) fmt.Println(slice_) var slice_1 []int = make([]int,5) fmt.Println(slice_1) var slice_2 []int = []int{1,2} fmt.Println(slice_2) 打印結果: [0 0 0 0 0] [0 0 0 0 0] [1,2]
make map
var m_ map[string]int = make(map[string]int) m_["one"] = 1 fmt.Println(m_) var m map[string]int = map[string]int{"1":1} m["2"] = 2 fmt.Println(m) 打印結果: map[one:1] map[1:1 2:2]
mak channel
var c = make(chan bool)
