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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么指針類型可以訪問嵌入類型的所有方法

為什么指針類型可以訪問嵌入類型的所有方法

Go
qq_花開花謝_0 2022-07-11 16:24:42
下面是嘗試embed類型的源碼。修改函數(shù)定義為func (f *F) Modify(f2 F)。誰(shuí)能解釋為什么第一個(gè)反射循環(huán)中沒有顯示修改函數(shù)?但是在第二個(gè)反射循環(huán)中,Modify和Validate都可以從 *s 中得到。package mainimport "fmt"import "reflect"type F func(int) boolfunc (f F) Validate(n int) bool {    return f(n)}func (f *F) Modify(f2 F) {    *f = f2}type B boolfunc (b B) IsTrue() bool {    return bool(b)}func (pb *B) Invert() {    *pb = !*pb}type I interface {    Load()    Save()}func PrintTypeMethods(t reflect.Type) {    fmt.Println(t, "has", t.NumMethod(), "methods:")    for i := 0; i < t.NumMethod(); i++ {        fmt.Print(" method#", i, ": ",                t.Method(i).Name, "\n")    }}func main() {    var s struct {        F        *B        I    }    PrintTypeMethods(reflect.TypeOf(s))    fmt.Println()    PrintTypeMethods(reflect.TypeOf(&s))}輸出:struct { main.F; *main.B; main.I } has 5 methods: method#0: Invert method#1: IsTrue method#2: Load method#3: Save method#4: Validate*struct { main.F; *main.B; main.I } has 6 methods: method#0: Invert method#1: IsTrue method#2: Load method#3: Modify method#4: Save method#5: Validate
查看完整描述

2 回答

?
拉莫斯之舞

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊

Method sets

一個(gè)類型可能有一個(gè)與之關(guān)聯(lián)的方法集。接口類型的方法集就是它的接口。任何其他類型 T 的方法集由所有用接收器類型 T 聲明的方法組成。對(duì)應(yīng)指針類型 *T 的方法集是用接收器 *T 或 T 聲明的所有方法的集合(即它還包含該方法T 組)。進(jìn)一步的規(guī)則適用于包含嵌入字段的結(jié)構(gòu),如結(jié)構(gòu)類型部分所述。任何其他類型都有一個(gè)空方法集。在方法集中,每個(gè)方法必須有一個(gè)唯一的非空方法名稱。

Struct types

如果 xf 是表示該字段或方法 f 的合法選擇器,則稱為提升結(jié)構(gòu) x 中嵌入字段的 字段或方法 f。

...

給定一個(gè)結(jié)構(gòu)類型 S 和一個(gè)定義類型 T,提升的方法包含在結(jié)構(gòu)的方法集中,如下所示:

  • If S contains an embedded field T, the method sets of S and *S both include promoted methods with receiver T. The method set of *S also includes promoted methods with receiver *T.

  • 如果 S 包含嵌入字段 *T,則 S 和 *S 的方法集都包含帶有接收器 T 或 *T 的提升方法。


查看完整回答
反對(duì) 回復(fù) 2022-07-11
?
偶然的你

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊

如果m為類型定義了方法T,則該方法對(duì)T和都可用*T:


type T struct {}


func (t T) m() {}


func main() {

   t:=T{}

   tp:=&T{}

   t.m()   // valid: m defined for T

   tp.m()  // valid: m defined for *T

}


如果一個(gè)方法是用指針接收器定義的,它只被定義為*T而不是為T':


func (t *T) n() {}


func main() {

   t:=T{}

   tp:=&TP{

   t.n() // Valid: &t is passed to n

   tp.b  // valid


   mp:=map[int]T{1:t}

   mp[1].n() // not valid. mp[1] is not addressable

   pp:=map[int]*T{1:&t}

   pp[1].n() // valid: pp[1] is *T

}

這樣做的原因很簡(jiǎn)單:它可以防止無(wú)意中修改副本而不是縮進(jìn)對(duì)象。如果帶有指針接收器的方法也可用于值類型,則使用以下代碼:


mp[1].n()

n,采用指針接收器,將修改 的值的副本mp[1],而不是存儲(chǔ)在 的值mp[1]。具有指針接收器的方法不可用于值類型的事實(shí)阻止了這一點(diǎn),這將成為編譯錯(cuò)誤,因?yàn)閚沒有為 定義T,并且mp[1]不可尋址,從而阻止了編譯器將值轉(zhuǎn)換為指針。


查看完整回答
反對(duì) 回復(fù) 2022-07-11
  • 2 回答
  • 0 關(guān)注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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