1.指標(預設值nil)
i, j := 42, 2701
p := *i //指標符號*不能直接使用在已經聲明好的變數名上,不然在編譯時間會報錯:invalid indirect of i (type int)
p := &i // 聲明並複製指標變數p
fmt.Println(*p) // 讀取指標變數指向的值,結果42
指標聲明方式,如
var ip *int /* 指向整型*/
var fp *float32 /* 指向浮點型 */
總結:指標變數只能接受&號擷取的記憶體位址,*號用來做指向記憶體位址中儲存值的功能
package mainimport "fmt"func main() { var a int= 20 /* 聲明實際變數 */ var ip *int /* 聲明指標變數 */ ip = &a /* 指標變數的值為變數a的儲存地址 */ fmt.Printf("a 變數的地址是: %x\n", &a ) /* 指標變數的儲存地址 */ fmt.Printf("ip 變數儲存的指標地址: %x\n", ip ) /* 使用指標訪問值 */ fmt.Printf("*ip 用來訪問指標變數指向的記憶體位址中儲存的值: %d\n", *ip ) *ip = 12 /* 此處修改的實際是a的值為12 */var ip2 **int ip2 = &ip /* 指標的指標,即記憶體位址的記憶體位址 */ fmt.Printf("**ip2 用來訪問指標的指標變數指向的記憶體位址中儲存的值: %d\n", **ip2 )}
1.2.指標數組
package mainimport "fmt"const MAX int = 3func main() { a := []int{10,100,200} var i int var ptr [MAX]*int; for i = 0; i < MAX; i++ { ptr[i] = &a[i] /* 整數地址賦值給指標數組 */ } for i = 0; i < MAX; i++ { fmt.Printf("a[%d] = %d\n", i,*ptr[i] ) }}
1.3.結構體指標
package mainimport "fmt"type Vertex struct {X intY int}func main() {v := Vertex{1, 2}p := &vp.X = 2 //結構體欄位可以通過結構體指標來訪問。fmt.Println(p) //輸出&{2 2}fmt.Println(p.X) //輸出2fmt.Println(v) //輸出{2 2}}
2.結構體初始化方法
package mainimport "fmt"type Vertex struct {X, Y int}var (v1 = Vertex{1, 2} // 類型為 Vertexv2 = Vertex{Y: 1} // 預設指定X:0v3 = Vertex{} // X:0 和 Y:0v4 = new(Vertex) //此方式不能賦初始值,這個實際建立的是個結構體指標p = &Vertex{1, 2} // 類型為 *Vertex)func main() {fmt.Println(v1, v2, v3, v4, p) //輸出{1 2} {0 1} {0 0} &{0 0} &{1 2}}
可以不初始化直接賦值並輸出
package mainimport "fmt"type Vertex struct {X intY int}func main() {var vertex Vertexfmt.Println(vertex) //未初始化,實際已預設初始化 new(Vertex)。輸出結果{0 0}vertex.X = 1vertex.Y = 2fmt.Println(vertex) //輸出{1 2}}
3.Map
未初始化map不能賦值
package mainimport "fmt"type Vertex struct {X intY int}func main() {var Asset map[string] VertexAsset["abc"] = vertexfmt.Println(Asset["abc"])}
編譯時間報錯:panic: assignment to entry in nil map
正常的樣本
package mainimport "fmt"type Vertex struct {X intY int}func main() {var Asset map[string] VertexAsset = make(map[string] Vertex)Asset["abc"] = vertexfmt.Println(Asset["abc"])}
map的增刪改查
package mainimport "fmt"func main() {m := make(map[string]int)m["Answer"] = 42 //初始化fmt.Println("The value:", m["Answer"])m["Answer"] = 48 //修改值fmt.Println("The value:", m["Answer"])delete(m, "Answer") //刪除值fmt.Println("The value:", m["Answer"])if m["Answer"] == 0 {fmt.Println("不存在的key") //不能存在的key的值為0}v, ok := m["Answer"] //通過雙賦值檢測某個鍵存在,如果 key 在 m 中, ok 為 true。否則, ok 為 false,並且 elem 是 map 的元素類型的零值。fmt.Println("The value:", v, "Present?", ok)}
4.1.切片(預設值nil)------------------一個 nil 的 slice 的長度和容量是 0。
運算式 s[lo:hi]
表示從 lo 到 hi-1 的 slice 元素,含前端,不包含後端。
4.2.構造切片
package mainimport "fmt"func main() {a := make([]int, 5)printSlice("a", a) //輸出a len=5 cap=5 [0 0 0 0 0]b := make([]int, 0, 5)printSlice("b", b) //輸出b len=0 cap=5 []c := b[:2]printSlice("c", c) //輸出c len=2 cap=5 [0 0]d := c[2:5]printSlice("d", d) //輸出d len=3 cap=3 [0 0 0]}func printSlice(s string, x []int) {fmt.Printf("%s len=%d cap=%d %v\n",s, len(x), cap(x), x)}
4.3.切片添加元素append var a []int = []int{1,2,3,4,5}
a = append(a,6)
package mainimport "fmt"func main() {var a []intprintSlice("a", a) //輸出a len=0 cap=0 []// append works on nil slices.a = append(a, 0)printSlice("a", a) //輸出a len=1 cap=2 [0]// the slice grows as needed.a = append(a, 1)printSlice("a", a) //輸出a len=2 cap=2 [0 1]// we can add more than one element at a time.a = append(a, 2, 3, 4)printSlice("a", a) //輸出a len=5 cap=8 [0 1 2 3 4]}func printSlice(s string, x []int) {fmt.Printf("%s len=%d cap=%d %v\n",s, len(x), cap(x), x)}
5.遍曆range--------有2個傳回值,1個是元素的索引,1個是元素的值,2個值也可通過如下方式任取一個
package mainimport "fmt"var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}func main() {for i, v := range pow {fmt.Printf("2**%d = %d\n", i, v)}for i := range pow {pow[i] = 1 << uint(i)}for _, value := range pow {fmt.Printf("%d\n", value)}}
當使用range遍曆map時,第一個元素為key值,第二個元素為value值
package mainimport "fmt"type IPAddr [4]byte// TODO: Add a "String() string" method to IPAddr.func main() {addrs := map[string]IPAddr{"loopback": {127, 0, 0, 1},"googleDNS": {8, 8, 8, 8},}for n, a := range addrs {fmt.Printf("%v: %v\n", n, a)}}
上邊輸出結果為
loopback: [127 0 0 1]googleDNS: [8 8 8 8]