Go語言 指標

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

Go語言保留著C中值和指標的區別,但是對於指標繁瑣用法進行了大量的簡化,引入引用的概念。所以在Go語言中,你幾乎不用擔心會因為直接操作內寸而引起各式各樣的錯誤。Go語言的指標,基本上只剩下用於區分 byref 和 byval 語義。

運算子就是簡單的 & 和 * 一個取地址、一個解析地址。

package mainimport(    "fmt")func main(){    var i int // i 的類型是int型    i=1 // i 的值為 1;    var p *int // p 的類型是[int型的指標]    p=&i         // p 的值為 [i的地址]    fmt.Printf("i=%d;p=%d;*p=%d\n",i,p,*p)    *p=2 // *p 的值為 [[i的地址]的指標] (其實就是i嘛),這行代碼也就等價於 i = 2    fmt.Printf("i=%d;p=%d;*p=%d\n",i,p,*p)    i=3 // 驗證想法    fmt.Printf("i=%d;p=%d;*p=%d\n",i,p,*p)}

這段代碼執行結果:

i=1;p=0x4212f100;p=1
i=2;p=0x4212f100;
p=2
i=3;p=0x4212f100;*p=3

函數的參數傳遞可以看下面例子:

package mainimport "fmt"type abc struct{    v int}func (a abc)aaaa(){ //傳入的是值,而不是引用    a.v=1    fmt.Printf("1:%d\n",a.v)}func (a *abc)bbbb(){ //傳入的是引用,而不是值    fmt.Printf("2:%d\n",a.v)    a.v=2    fmt.Printf("3:%d\n",a.v)}func (a *abc)cccc(){ //傳入的是引用,而不是值    fmt.Printf("4:%d\n",a.v)}func main(){    aobj:=abc{}  //new(abc);    aobj.aaaa()    aobj.bbbb()    aobj.cccc()}

輸出結果:

1:1
2:0
3:2
4:2

傳值與傳指標當我們傳一個參數值到被調用函數裡面時,實際上是傳了這個值的一份copy,當在被調用函數中修改參數值的時候,調用函數中相應實參不會發生任何變化,因為數值變化只作用在copy上。

傳指標比較輕量級 (8bytes),只是傳記憶體位址,我們可以用指標傳遞體積大的結構體。如果用參數值傳遞的話, 在每次copy上面就會花費相對較多的系統開銷(記憶體和時間)。所以當你要傳遞大的結構體的時候,用指標是一個明智的選擇。

Go語言中string,slice,map這三種類型的實現機制類似指標,所以可以直接傳遞,而不用取地址後傳遞指標。(註:若函數需改變slice的長度,則仍需要取地址傳遞指標)

要訪問指標 p 指向的結構體中某個元素 x,不需要顯式地使用 * 運算,可以直接 p.x ;

一個稍微複雜的例子

package mainimport "fmt"type S map[string][]stringfunc Summary(paramstring)(s*S){    s=&S{        "name":[]string{param},        "profession":[]string{"Javaprogrammer","ProjectManager"},        "interest(lang)":[]string{"Clojure","Python","Go"},        "focus(project)":[]string{"UE","AgileMethodology","SoftwareEngineering"},        "hobby(life)":[]string{"Basketball","Movies","Travel"},    }    return s}func main(){    s:=Summary("Harry")    fmt.Printf("Summary(address):%v\r\n",s)    fmt.Printf("Summary(content):%v\r\n",*s)}

輸出:

Summary(address): 0x42131100
Summary(content): map[profession:[Java programmer Project Manager] interest(lang):[Clojure Python Go] hobby(life):[Basketball Movies Travel] name:[Harry] focus(project):[UE Agile Methodology Software Engineering]]

exit code 0, process exited normally.


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.