第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 非結(jié)構(gòu)類型指針接收器

Golang 非結(jié)構(gòu)類型指針接收器

Go
楊__羊羊 2022-03-03 15:08:31
我創(chuàng)建了一個基于 Golang 類型的自定義net.IP類型。令我驚訝的是,使用指向我的自定義類型的指針接收器聲明的方法無法修改接收器指向的值。此代碼段中的u變量在nil調(diào)用u.defaultIP(). 如果我將自定義類型更改為具有 IP 字段的結(jié)構(gòu)并且該方法是使用指向該結(jié)構(gòu)的指針接收器定義的,則可以修改 IP。我錯過了什么?可執(zhí)行示例可以在這里找到。type userIP net.IPfunc main() {  var u *userIP  u.defaultIP()  fmt.Printf("%v\n", u) }func (u *userIP) defaultIP() {  defaultIP := userIP("127.0.0.1")  u = &defaultIP}
查看完整描述

3 回答

?
當(dāng)年話下

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


查看完整回答
反對 回復(fù) 2022-03-03
?
慕婉清6462132

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.


查看完整回答
反對 回復(fù) 2022-03-03
?
慕無忌1623718

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) 切片作為輸入。


查看完整回答
反對 回復(fù) 2022-03-03
  • 3 回答
  • 0 關(guān)注
  • 209 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號