3 回答

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

TA貢獻1804條經驗 獲得超2個贊
指針接收器需要先取消引用,然后才能設置它的值。這適用于結構和非結構類型。在結構類型的情況下,取消引用由選擇器表達式自動完成。
在進一步挖掘之后,我認為這種行為是由于指針接收器與調用該方法的指針不同。
運行這段代碼可以看出,函數中的u指針與方法中的指針main()不同defaultIP()。本質上,我最終只修改了方法u中的指針defaultIP()??蓤绦惺纠梢栽谶@里找到。
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 包裝為結構中的一個字段,為什么這個示例會起作用?運行代碼片段顯示,這兩個u指針確實不同,但ip修改了字段。可執行示例可以在這里找到。
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)
}
原來這是由選擇器表達式( x.y) 引起的。引用文檔,
選擇器會自動取消引用指向結構的指針。如果 x 是指向結構的指針,則 xy 是 ( x).y 的簡寫;如果字段 y 也是指向結構的指針,則 xyz 是 ( (*x).y).z 的簡寫,依此類推。如果 x 包含 *A 類型的匿名字段,其中 A 也是結構類型,則 xf 是 (*xA).f 的快捷方式。
因此,在我的情況下,u.ip表達式u在修改ip字段之前取消引用,這基本上轉換為(*u).ip.

TA貢獻1744條經驗 獲得超4個贊
兩個選項:
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 地址,一個字節片。此包中的函數接受 4 字節 (IPv4) 或 16 字節 (IPv6) 切片作為輸入。
- 3 回答
- 0 關注
- 213 瀏覽
添加回答
舉報