之間的區別是什麼?有人可以解釋&和GO中lang *之間的區別嗎?並提供&和*用於說明區別的示例? 從我讀過的內容來看,它們都涉及訪問變量內存位置,但我不確定何時使用&或*。在golang中,&和*
回答
下面是一個非常簡單的例子,它說明了如何使用&
和*
。請注意,*
可用於兩個不同的事情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
它們恰恰相反。如在解釋the "Address operators" section of the spec:
對於
T
類型的操作數x
,寫入動作&x
產生*T
類型的到x
的指針。 […]對於指針類型
*T
的操作數x
,指針間接*x
表示T
類型的變量通過x
指向。如果x
是nil
,則嘗試評估*x
將導致運行時恐慌。
換句話說:&
採用可變(或其它可尋址實體),並返回一個指向它的指針,而*
需要一個指針,並返回件事,它指向(除非它是nil
,這意味着它不沒有指向任何東西)。
&
是操作員的地址。在某些情況下,*
代表一個指針,而在其他情況下,它被用作'解引用運算符'。
所以基本上,如果你做p := &SometType{}
運營商的地址是用來如果我要刪除它返回與複合文字敘述SomeType{}
創建的對象的地址,我將不再有一個參考,而是被分配值直接到p
。在這種情況下,p
將是*SomeType
,因爲那是我所用的地址類型。如果我在前面聲明一個類型爲*
,我將它指定爲該類型的指針。
現在剩下的最後一個用途就是作爲一個尊敬的操作符,在我的經驗中,你不會在Go中使用這麼多,但它在C和C++中是超常見的。這用於返回實際值,而這通常是賦值的槓桿作用。因爲如果我有p
並且它是*SomeType
並且本地我想要分配給SomeType
的實例,那麼我將需要以下語句someType := *p
,以便將值分配給我的值類型。
希望解釋有幫助。這不是最具技術性的,而是我的目標是提供對常見用途的理解。
&和*主要用於功能:
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
}
&
進行從可變的指針。
*
「提取」存儲在指針指向的值。
對於類型,var *type
意味着「* VAR的類型爲類型」(並且沒有一個變量,它只是意味着「一個指針類型的東西」。
- 1. cpuprofile和memprofile在golang測試
- 2. openpgp和golang
- 3. Golang和NSQ(bitly)
- 4. golang DeepEqual和reflect.Zero
- 5. NTLM和Golang
- 6. Android,Golang和SSL
- 7. 在golang
- 8. 在Golang
- 9. 在golang
- 10. 在Golang
- 11. 在goLang
- 12. 在golang
- 13. 在golang
- 14. storelocator與golang和mongodb
- 15. Golang和JSON結構
- 16. GAE Golang - OAuth和OAuth2?
- 17. 在Golang中創建方法
- 18. 在Golang中返回結構
- 19. 在Golang中彙集地圖
- 20. 在golang中使用PGP
- 21. 在Golang中啓用CORS
- 22. 在Golang中解析時間
- 23. 在Golang中繞過http_proxy
- 24. 在Golang中相當於package.json
- 25. golang io.TeeReader在os.stdin中斷tty
- 26. GOanda在GoLang
- 27. 獲得在Golang
- 28. 谷歌在Golang
- 29. RWMutex.Lock()在golang
- 30. 無限在golang
很難用錯了一個,因爲它通常不會編譯,只需嘗試一下就可以瞭解他們的工作:http://tour.golang.org/moretypes/1 – JimB
我第二個建議是,我無法準確地聲明規則兩個操作員都喜歡什麼樣的規範來拯救我的生命,但是當我需要通過反覆試驗時,我會讓它們工作。大多數情況下,如果它是錯誤的,它將不會編譯,因爲您將在兩側都有不兼容的類型分配 – evanmcdonnal