Go語言奇妙點

來源:互聯網
上載者:User
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]



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.