3 回答

TA貢獻(xiàn)1890條經(jīng)驗(yàn) 獲得超9個贊
u
在設(shè)置它的值之前,您需要取消引用。
從你的例子中,改變
defaultIP := userIP("127.0.0.1") u = &defaultIP
到
*u = userIP("127.0.0.1")
對于您的示例更新和工作: https: //play.golang.org/p/ycCLT0ed9F

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個贊
指針接收器需要先取消引用,然后才能設(shè)置它的值。這適用于結(jié)構(gòu)和非結(jié)構(gòu)類型。在結(jié)構(gòu)類型的情況下,取消引用由選擇器表達(dá)式自動完成。
在進(jìn)一步挖掘之后,我認(rèn)為這種行為是由于指針接收器與調(diào)用該方法的指針不同。
運(yùn)行這段代碼可以看出,函數(shù)中的u指針與方法中的指針main()不同defaultIP()。本質(zhì)上,我最終只修改了方法u中的指針defaultIP()??蓤?zhí)行示例可以在這里找到。
func main() {
var u *userIP
u.defaultIP()
fmt.Printf("main(): address of pointer is %v\n", &u)
fmt.Printf("main(): user IP address is %v\n", u)
}
type userIP net.IP
func (u *userIP) defaultIP() {
defaultIP := userIP("127.0.0.1")
u = &defaultIP
fmt.Printf("defaultIP(): address of pointer is %v\n", &u)
fmt.Printf("defaultIP(): user IP address is %s\n", *u)
}
正確的方法是湯姆的回答中指出的,即方法u中的取消引用defaultIP()。
之前讓我感到困惑的是,如果我將 IP 包裝為結(jié)構(gòu)中的一個字段,為什么這個示例會起作用?運(yùn)行代碼片段顯示,這兩個u指針確實(shí)不同,但ip修改了字段??蓤?zhí)行示例可以在這里找到。
func main() {
u := &userInfo{}
u.defaultIP()
fmt.Printf("main(): address of pointer is %v\n", &u)
fmt.Printf("main(): user IP address is %s\n", u.ip)
}
type userInfo struct{
ip net.IP
}
func (u *userInfo) defaultIP() {
u.ip = net.ParseIP("127.0.0.1")
fmt.Printf("defaultIP(): address of pointer is %v\n", &u)
fmt.Printf("defaultIP(): user IP address is %s\n", u.ip)
}
原來這是由選擇器表達(dá)式( x.y) 引起的。引用文檔,
選擇器會自動取消引用指向結(jié)構(gòu)的指針。如果 x 是指向結(jié)構(gòu)的指針,則 xy 是 ( x).y 的簡寫;如果字段 y 也是指向結(jié)構(gòu)的指針,則 xyz 是 ( (*x).y).z 的簡寫,依此類推。如果 x 包含 *A 類型的匿名字段,其中 A 也是結(jié)構(gòu)類型,則 xf 是 (*xA).f 的快捷方式。
因此,在我的情況下,u.ip表達(dá)式u在修改ip字段之前取消引用,這基本上轉(zhuǎn)換為(*u).ip.

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個贊
兩個選項(xiàng):
1-取消引用:像這個工作代碼并使用net.ParseIP("127.0.0.1")
(The Go Playground):
package main
import (
"fmt"
"net"
)
type userIP net.IP
func main() {
var u userIP
u.defaultIP()
fmt.Println(u)
}
func (u *userIP) defaultIP() {
*u = userIP(net.ParseIP("127.0.0.1"))
}
輸出:
[0 0 0 0 0 0 0 0 0 0 255 255 127 0 0 1]
2-沒有取消引用(Go Playground):
package main
import (
"fmt"
"net"
)
type userIP net.IP
func main() {
u := make(userIP, 4)
u.defaultIP()
fmt.Printf("%v\n", u)
}
func (u userIP) defaultIP() {
u[0], u[1], u[2], u[3] = 127, 0, 0, 1
}
請注意net.IP,[]byte請參閱net.IP文檔:
IP 是單個 IP 地址,一個字節(jié)片。此包中的函數(shù)接受 4 字節(jié) (IPv4) 或 16 字節(jié) (IPv6) 切片作為輸入。
- 3 回答
- 0 關(guān)注
- 209 瀏覽
添加回答
舉報