go方法的深入探究(7.21增补)
生活随笔
收集整理的這篇文章主要介紹了
go方法的深入探究(7.21增补)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
1)哪些類型可以有方法:????????1)只能對命名類型和命名類型的指針編寫方法;
????????2)不能對接口類型和接口類型的指針編寫方法;
????????3)只能在定義命名類型的那個包編寫其方法。
2)receiver是值的方法,編譯器會隱式的生成一個receiver是對應類型指針的同名方法。反過來卻不會。
3)結構體的匿名字段的類型限制:
????????1)不可以是未命名類型;
????????2)可以是命名類型或命令類型的指針類型;
????????3)接口類型可以,接口類型的指針類型不行;
4)結構體匿名字段的方法向外傳遞的規則:
????????1)匿名字段為值類型時:值的方法會傳遞給結構體的值,指針的方法會傳遞給結構體的指針;
????????2)匿名字段為指針類型時:指針的方法會傳遞給值和指針;
????????3)匿名字段為接口類型時:方法會傳遞給值和指針;
5)匿名字段的方法,是被經過包裝實現為外圍結構體的方法。
6)使用具體的類型去調用方法時。
????????首先,編譯器查看該類型下有沒有該方法;
????????其次,擴展查看該類型的指針類型或者基類型(如果該類型是指針類型);
????????最后,如果以上查找都未找到,則會報錯。
????? ? 注:擴展查看不會查看隱式實現的方法(匿名字段傳遞出來的方法、值=>指針隱式實現的方法)
7)具體類型的方法集是以該類型為receiver的方法的集合。
8)接口類型的方法集就是其定義里聲明的方法,接口調用方法時類似C++調用虛函數;接口的指針沒有方法集。
9)類型存入接口時只檢查方法集;調用接口的方法時也只檢查方法集;reflect包同樣只查看方法集。
因此:
類型A的方法,A和*A都可以調用;
類型A的方法,雖然隱式實現了類型*A的方法,**A卻不能調用;
類型*A的方法,A、*A、**A都可以調用;
不能實現**A的方法;
type A ... func (a A)X(){} func (a *A)Y(){} type IX interface{X() } type IY interface{Y() }a := A{} b := &a c := &ba.X() // ok b.X() // ok c.X() // errora.Y() // ok b.Y() // ok c.Y() // okvar ix IX ix = a // ok ix = b // ok ix = c // errorvar iy IY iy = a // error iy = b // ok iy = c // errorvar jx IX jx = ix // ok jx = &ix // error
對于代碼:
type I interface {IE() }type A intfunc (_ A) VA() {} func (_ *A) PA() {}type B struct {I } func (_ B) VB() {} func (_ *B) PB() {}type C struct {A } func (_ C) VC() {} func (_ *C) PC() {}type D struct {*A } func (_ D) VD() {} func (_ *D) PD() {}
下面的列表說明了其方法集和方法的來源:
| type(類型) | explicit(顯式定義的方法) | ?implicit(隱式實現的方法) | ?inherit(繼承自匿名字段的方法) |
| I | IE | | |
| *I | | | |
| A | VA | | |
| *A | PA | VA | |
| B | VB | | IE |
| *B | PB | VB | IE |
| C | VC | | VA |
| *C | PC | VC | PA,VA |
| D | VD | | PA,VA |
| *D | PD | VD | PA,VA |
轉載于:https://my.oschina.net/liudiwu/blog/292698
總結
以上是生活随笔為你收集整理的go方法的深入探究(7.21增补)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: angular $watch
- 下一篇: 时隔两年 重新当码农