本文內容是本人對Go語言的變量、常量、數組、切片、映射、結構體的備忘錄,記錄了關鍵的相關知識點,以供翻查。html
文中若有錯誤的地方請你們指出,以避免誤導!轉摘本文也請註明出處:Go語言備忘錄(1):基本數據結構,多謝!node
參考書籍《The Go Programming Language》、《Go In Action》、《Go語言學習筆記》等數據庫
目錄:數組
var q int var y = 453 var ( n,m = 134,"srf" n1,m1 int ) func f1() { n,m := 25,"sss" n,m1 := 34,"yyy" fmt.Println(n,m,m1) n = n+5 //賦值表達式中,首先計算右值 //「_」空標識符用來臨時規避編譯器對未使用變量和導入包的錯誤檢查 if _,ok := add1(n);ok { fmt.Println(n) } } func add1(n int) (int, bool) { return n+1,true }
const i = 5 const ( x byte = 1 x1 x2 //x1,x2均爲1 s = "abs" s1 //s1=「abc」 ) const ( _,_ int = iota,iota*3 //0,0*3 忽略值,並顯式指定類型爲int k1,k2 //1,1*3 l1,l2 //2,2*3 o1,o2 = 5,6 //中斷iota自增 r1,r2 //5,6 同上一行 e1,e2 = iota,iota*3 //5,5*3 恢復iota自增,按行遞增 ) //枚舉 type color byte const ( blue color = iota red green ) func main() { t:= blue fmt.Println(t) //0 //fmt.Println(&i) //錯誤:沒法對常量取地址 cannot take the address of i }
3、數組併發
//切片自己是個只讀對象,工做機制相似數組指針的一種包裝 type slice struct{ array unsafe.Pointer len int //可讀寫的元素數量 cap int //所引用數組片斷的真實長度 }
//利用reslice實現一個棧式結構(也可將stack定義爲一個類型) var stack = make([]int,0,5) func push(x int) error { n:=len(stack) if n == cap(stack) { return errors.New("stack is full") } stack = stack[:n+1] //新的stack增長了一個可訪問元素stack[n] stack[n]=x return nil } func pop() (int, error) { n:=len(stack) if n == 0 { return 0,errors.New("stack is empty") } x:=stack[n-1] stack = stack[:n-1] //新的stack減小了一個可訪問元素stack[n-1] return x,nil } func main() { for i := 0; i < 7; i++ { fmt.Printf("push %d: %v,%v\n",i,push(i),stack) } for i := 0; i < 7; i++ { x,err:=pop() fmt.Printf("push %d: %v,%v\n",x,err,stack) } }
m := users[int]user{ 1:{"srf",25} } //m[1].age +=1 //錯誤,沒法設置值 u := m[1] u.age+=1 m[1] = u
func main() { var lock sync.RWMutex m:=make(map[string]int) go func() { for { lock.Lock() m["a"] += 1 lock.Unlock() //不能用defer time.Sleep(time.Microsecond) } }() go func() { for { lock.RLock() _ = m["b"] lock.RUnlock() time.Sleep(time.Microsecond) } }() select {} //阻止進程退出 }
func equal(x, y map[string]int) bool { if len(x) != len(y) { return false } for k, xv := range x { if yv, ok := y[k]; !ok || yv != xv { return false } } return true }
6、結構體app
type node struct{ _ int id int `帳號` next *node }
u := struct{ name string } type file struct{ name string attr struct{ owner int perm int } } f := file{name:"test.dat"} f.attr.owner = 1 f.attr.perm = 0755
type user struct{ name string `暱稱` sex byte `性別` } func main(){ u:=user{"TOM",1} v:=reflect.ValueOf(u) t:=v.Type() for i,n:=0,t.NumField();i<n;i++{ fmt.Printf("%s: %v\n", t.Field(i).Tag, v.Field(i)) } }