<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Go指針 不要害怕,Go的指針是好指針。 **定義** 所謂`指針其實你可以把它想像成一個箭頭,這個箭頭指向(存儲)一個變量的地址`。 因為這個箭頭本身也需要變量來存儲,所以也叫做指針變量。 Go的指針`不支持那些亂七八糟的指針移位`。`它就表示一個變量的地址`。看看這個例子: package main import ( "fmt" ) func main() { var x int var x_ptr *int x = 10 x_ptr = &x fmt.Println(x) fmt.Println(x_ptr) fmt.Println(*x_ptr) } 上面例子輸出`x的值`,`x的地址`和`通過指針變量輸出x的值`,而`x_ptr就是一個指針變量`。 10 0xc084000038 10 認真理清楚這兩個符號的意思。 **&** `取一個變量的地址` **\*** `取一個指針變量所指向的地址的值` 考你一下,上面的例子中,如何輸出x_ptr的地址呢? package main import ( "fmt" ) func main() { var x int var x_ptr *int x = 10 x_ptr = &x fmt.Println(&x_ptr) } 此例看懂,指針就懂了。 永遠記住一句話,`所謂指針就是一個指向(存儲)特定變量地址的變量`。沒有其他的特別之處。 再變態一下,看看這個: package main import ( "fmt" ) func main() { var x int var x_ptr *int x = 10 x_ptr = &x fmt.Println(*&x_ptr) } 1. x_ptr 是一個`指針變量`,它`指向(存儲)x的地址`; 2. &x_ptr 是`取這個指針變量x_ptr的地址`,這里可以設想`有另一個指針變量x_ptr_ptr(指向)存儲`這個`x_ptr指針的地址`; 3. *&x_ptr 等價于`*x_ptr_ptr`就是`取這個x_ptr_ptr指針變量`所`指向(存儲)`的`地址所對應的變量的值` ,也就是`x_ptr的值`,也就是`指針變量x_ptr指向(存儲)的地址`,也就是`x的地址`。 這里可以看到,其實`*&`這兩個運算符在一起就相互抵消作用了。 **用途** `指針的一大用途就是可以將變量的指針作為實參傳遞給函數,從而在函數內部能夠直接修改實參所指向的變量值。` Go的變量傳遞都是值傳遞。 package main import ( "fmt" ) func change(x int) { x = 200 } func main() { var x int = 100 fmt.Println(x) change(x) fmt.Println(x) } 上面的例子輸出結果為 100 100 很顯然,change函數`改變的`僅僅是`內部變量x`的`值`,而`不會改變`傳遞進去的`實參`。其實,也就是說Go的函數一般關心的是輸出結果,而輸入參數就相當于信使跑到函數門口大叫,你們這個參數是什么值,那個是什么值,然后就跑了。你函數根本就不能修改它的值。不過如果是傳遞的實參是指針變量,那么函數一看,小子這次你地址我都知道了,哪里跑。那么就是下面的例子: package main import ( "fmt" ) func change(x *int) { *x = 200 } func main() { var x int = 100 fmt.Println(x) change(&x) fmt.Println(x) } 上面的例子中,change函數的虛參為`整型指針變量`,所以在main中調用的時候`傳遞的是x的地址`。然后在change里面使用`*x=200`修改了這個x的地址的值。所以`x的值就變了`。這個輸出是: 100 200 **new** new這個函數挺神奇,因為它的用處太多了。這里還可以通過new來`初始化一個指針`。上面說過指針指向(存儲)的是一個變量的地址,但是指針本身也需要地址存儲。先看個例子: package main import ( "fmt" ) func set_value(x_ptr *int) { *x_ptr = 100 } func main() { x_ptr := new(int) set_value(x_ptr) //x_ptr指向的地址 fmt.Println(x_ptr) //x_ptr本身的地址 fmt.Println(&x_ptr) //x_ptr指向的地址值 fmt.Println(*x_ptr) } 上面我們定義了一個x_ptr變量,然后用`new申請`了一個`存儲整型數據的內存地址`,然后將這個`地址賦值`給`x_ptr指針變量`,也就是說`x_ptr指向(存儲)的是一個可以存儲整型數據的地址`,然后用set_value函數將`這個地址中存儲的值`賦值為100。所以第一個輸出是`x_ptr指向的地址`,第二個則是`x_ptr本身的地址`,而`*x_ptr`則是`x_ptr指向的地址中存儲的整型數據的值`。 0xc084000040 0xc084000038 100 **小結** 好了,現在用個例子再來回顧一下指針。 交換兩個變量的值。 package main import ( "fmt" ) func swap(x, y *int) { *x, *y = *y, *x } func main() { x_val := 100 y_val := 200 swap(&x_val, &y_val) fmt.Println(x_val) fmt.Println(y_val) } 很簡單吧,這里利用了Go提供的`交叉賦值`的功能,另外由于是使用了指針作為參數,所以在swap函數內,x_val和y_val的值就被交換了。
                  <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>

                              哎呀哎呀视频在线观看