2015-10-20 324 views
4

之間的區別是什麼?有人可以解釋&和GO中lang *之間的區別嗎?並提供&和*用於說明區別的示例? 從我讀過的內容來看,它們都涉及訪問變量內存位置,但我不確定何時使用&或*。在golang中,&和*

+2

很難用錯了一個,因爲它通常不會編譯,只需嘗試一下就可以瞭解他們的工作:http://tour.golang.org/moretypes/1 – JimB

+0

我第二個建議是,我無法準確地聲明規則兩個操作員都喜歡什麼樣的規範來拯救我的生命,但是當我需要通過反覆試驗時,我會讓它們工作。大多數情況下,如果它是錯誤的,它將不會編譯,因爲您將在兩側都有不兼容的類型分配 – evanmcdonnal

回答

6

下面是一個非常簡單的例子,它說明了如何使用&*。請注意,*可用於兩個不同的事情1)聲明一個變量作爲指針2)取消引用指針。

package main 

import "fmt" 

func main() { 
    b := 6 

    var b_ptr *int // *int is used delcare variable 
        // b_ptr to be a pointer to an int 

    b_ptr = &b  // b_ptr is assigned value that is the address 
         // of where variable b is stored 

    // Shorhand for the above two lines is: 
    // b_ptr := &b 

    fmt.Printf("address of b_ptr: %p\n", b_ptr) 

    // We can use *b_ptr get the value that is stored 
    // at address b_ptr, or dereference the pointer 
    fmt.Printf("value stored at b_ptr: %d\n", *b_ptr) 

} 

結果:

address of b_ptr: 0xc82007c1f0 
value stored at b_ptr: 6 
+0

在「func HandleFunc(模式字符串,處理程序func(ResponseWriter,* Request))」的上下文中,爲什麼Request取消引用指針,而ResponseWriter沒有? – tyonne

+0

函數簽名通常看起來像這個'func(w http.ResponseWriter,r * http.Request)',其中'w'是'http.ResponseWriter'對象,'r'是一個指向'http.Request'對象的指針。在這種情況下不存在解引用。 – Akavall

5

它們恰恰相反。如在解釋the "Address operators" section of the spec

對於T類型的操作數x,寫入動作&x產生*T類型的到x的指針。 […]

對於指針類型*T的操作數x,指針間接*x表示T類型的變量通過x指向。如果xnil,則嘗試評估*x將導致運行時恐慌。

換句話說:&採用可變(或其它可尋址實體),並返回一個指向它的指針,而*需要一個指針,並返回件事,它指向(除非它是nil,這意味着它不沒有指向任何東西)。

+0

終止正確的修正:'&'操作可能需要一個值,而不需要一個變量 - 一個很好的例子是從地址中取出一個地址,就像'v:=&SomeType {}'; '*'運算符返回一個值,而不是一個變量。變量是名字;您可以在需要值來引用該值的上下文中使用它,但指針解除引用操作符返回一個值,並且該值可能沒有綁定的變量。 – kostix

+0

@kostix:好的,謝謝;固定。我太習慣Java規範,任何左值被稱爲「變量」。 :-P – ruakh

2

&是操作員的地址。在某些情況下,*代表一個指針,而在其他情況下,它被用作'解引用運算符'。

所以基本上,如果你做p := &SometType{}運營商的地址是用來如果我要刪除它返回與複合文字敘述SomeType{}創建的對象的地址,我將不再有一個參考,而是被分配值直接到p。在這種情況下,p將是*SomeType,因爲那是我所用的地址類型。如果我在前面聲明一個類型爲*,我將它指定爲該類型的指針。

現在剩下的最後一個用途就是作爲一個尊敬的操作符,在我的經驗中,你不會在Go中使用這麼多,但它在C和C++中是超常見的。這用於返回實際值,而這通常是賦值的槓桿作用。因爲如果我有p並且它是*SomeType並且本地我想要分配給SomeType的實例,那麼我將需要以下語句someType := *p,以便將值分配給我的值類型。

希望解釋有幫助。這不是最具技術性的,而是我的目標是提供對常見用途的理解。

-3

&和*主要用於功能:

package main 

import (
    "fmt" 
) 

type Person struct { 
    name  string 
    ageYears int 
    areDays int 
} 

func main() { 
    john := Person{name: "John", ageYears: 46} 
    toDays(&john) 
    fmt.Println(john) //{John 46 16790} 
    toDays2(john) 
    fmt.Println(john) //{John 46 16790} 
} 

func toDays(p *Person) { 
    p.areDays = p.ageYears * 365 
} 

func toDays2(p Person) { 
    p.areDays = -1 
} 
1

&進行從可變的指針。

*「提取」存儲在指針指向的值。

對於類型,var *type意味着「* VAR的類型爲類型」(並且沒有一個變量,它只是意味着「一個指針類型的東西」。