<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                >[info] 指針 區別于C/C++中的指針,Go語言中的指針不能進行偏移和運算,是安全指針。 要搞明白Go語言中的指針需要先知道3個概念:**指針地址、指針類型、指針取值。** >[info] Go語言中的指針 Go語言中的函數傳參都是值拷貝,當我們想要修改某個變量的時候,我們可以創建一個指向該變量地址 的指針變量。傳遞數據使用指針,而無須拷貝數據。類型指針不能進行偏移和運算。Go語言中的指針操 作非常簡單,只需要記住兩個符號: & (取地址)和 * (根據地址取值)。 >[info] 指針地址和指針類型 每個變量在運行時都擁有一個地址,這個地址代表變量在內存中的位置。Go語言中使用&字符放在變量 前面對變量進行 “取地址” 操作。 Go語言中的值類型 (int、float、bool、string、array、 struct) 都有對應的指針類型,如: *int、*int64、*string 等。 * **示例:** ~~~ package main import ( "fmt" ) func main() { a := 10 b := &a fmt.Printf("a:%d ptr:%p\n", a, &a) // a:10 ptr:0xc00001a078 fmt.Printf("b:%p type:%T\n", b, b) // b:0xc00001a078 type:*int fmt.Println(&b) // 0xc00000e018 fmt.Println(*b) // 取值 } ~~~ >[info] . 指針取值 在對普通變量使用&操作符取地址后會獲得這個變量的指針,然后可以對指針使用 * 操作,也就是指 針取值,代碼如下。 * **示例:** ~~~ package main import ( "fmt" ) func main() { //指針取值 a := 10 b := &a // 取變量a的地址,將指針保存到b中 fmt.Printf("type of b:%T\n", b) c := *b // 指針取值(根據指針去內存取值) fmt.Printf("type of c:%T\n", c) fmt.Printf("value of c:%v\n", c) } ~~~ * **結果:** ``` type of b:*int type of c:int value of c:10 ``` **總結:** 取地址操作符&和取值操作符 * 是一對互補操作符, & 取出地址, * 根據地址取出地址指向的值。 >[info] 空指針 當一個指針被定義后沒有分配到任何變量時,它的值為 nil * **示例:** ~~~ package main import "fmt" func main() { var p *string fmt.Println(p) fmt.Printf("p的值是%s/n", p) if p != nil { fmt.Println("非空") } else { fmt.Println("空值") } } ~~~ * **結果:** ``` <nil> p的值是%!s(*string=<nil>)/n空值 ``` ***** **空指針異常:** panic: runtime error: invalid memory address or nil pointer dereference * **示例:** ~~~ package main import "fmt" func main() { var a *int *a = 100 fmt.Println(*a) var b map[string]int b["測試"] = 100 fmt.Println(b) } ~~~ * **結果:** ``` panic: runtime error: invalid memory address or nil pointer dereference [signal 0xc0000005 code=0x1 addr=0x0 pc=0xfdeba] goroutine 1 [running]: main.main() D:/goproject/test.go:7 +0x1a ``` >[info] new 和 make 1. new 函數 new函數不太常用,使用new函數得到的是一個類型的指針,并且該指針對應的值為該類型的零值。 * **示例:** ~~~ package main import "fmt" func main() { a := new(int) b := new(bool) fmt.Printf("%T\n", a) // *int fmt.Printf("%T\n", b) // *bool fmt.Println(*a) // 0 fmt.Println(*b) // false } ~~~ ***** 示例代碼中 var a *int 只是聲明了一個指針變量a但是沒有初始化,指針作為引用類型 需要初始化后才會擁有內存空間,才可以給它賦值。應該按照如下方式使用內置的new函數對a進行初始 化之后就可以正常對其賦值了: * **示例:** ~~~ package main import "fmt" func main() { var a *int a = new(int) *a = 10 fmt.Println(*a) // 10 } ~~~ 2. make 函數 make也是用于內存分配的,區別于new,它只用于slice、map以及chan的內存創建,而且它返回的類 型就是這三個類型本身,而不是他們的指針類型,因為這三種類型就是引用類型,所以就沒有必要返回 他們的指針了。 * **示例:** ~~~ package main import "fmt" func main() { var b map[string]int b = make(map[string]int, 10) b["測試"] = 100 fmt.Println(b)// map[測試:100] } ~~~ 3. new 與 make的區別 ~~~ 1. 二者都是用來做內存分配的。 2. make只用于slice、map以及channel的初始化,返回的還是這三個引用類型本身; 3. 而new用于類型的內存分配,并且內存對應的值為類型零值,返回的是指向類型的指針。 ~~~ >[info] 指針小練習 ~~~ package main import "fmt" func main() { var a int fmt.Println(&a) // 0xc0000a6058 var p *int p = &a *p = 20 fmt.Println(a) // 20 } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看