錯誤翻譯理解
不能返回字段或者方法的值微信
報錯代碼
定義倆個結構體,People 和 PeopleParent
package main import ( "fmt" "reflect" ) type PeopleParent struct { kaka string } type People struct { PeopleParent name string age int }
定義方法valueAPI方法
func valueAPI(obj interface{ }) { valueOf := reflect.ValueOf(obj) // 獲取全部屬性值 for i := 0; i < valueOf.NumField(); i++ { value := valueOf.Field(i) // {} //咔咔 //24 fmt.Println(value) } // 獲取父類屬性 fieldByIndex := valueOf.FieldByIndex([]int{ 0, 0}) fmt.Println(fieldByIndex.Interface()) // 咔咔的父類屬性 }
main方法調用valueAPI
func main() { p := People{ PeopleParent: PeopleParent{ kaka: "咔咔的父類屬性"}, name: "咔咔", age: 24, } typeAPI(p) valueAPI(p) }
報錯截圖
問題分析
咱們根據學習PHP的經驗來分析這個錯誤,在PHP中一個屬性有三種訪問方式,私有的,可繼承的,公共的。那麼在go中,咱們有公開的和私有的。可是在go語言的表現方式是屬性的大小寫和方法的大小寫。
這個時候咱們應該就能夠反映過來了,在上面案例,咱們獲取的是父類屬性的正射,可是報錯返回的是不能返回字段或者屬性
而後咱們回過頭在來看一下,發現咱們父類的kaka屬性確實是小寫,那麼我們更改成大寫後在編譯一次學習
更改後的源碼
package main import ( "fmt" "reflect" ) type PeopleParent struct { Kaka string } type People struct { PeopleParent name string age int } func (p *People) eat() { fmt.Println("咔咔") } func main() { p := People{ PeopleParent: PeopleParent{ Kaka: "咔咔的父類屬性"}, name: "咔咔", age: 24, } valueAPI(p) } func valueAPI(obj interface{ }) { valueOf := reflect.ValueOf(obj) // 獲取全部屬性值 for i := 0; i < valueOf.NumField(); i++ { value := valueOf.Field(i) // {} //咔咔 //24 fmt.Println(value) } // 獲取父類屬性 fieldByIndex := valueOf.FieldByIndex([]int{ 0, 0}) fmt.Println(fieldByIndex.Interface()) // 咔咔的父類屬性 }
返回結果
這個時候咱們就獲取到了父類屬性值的正射
spa
問題回顧
這個錯誤的緣由是咱們對在go中對於結構體的屬性訪問方式不明確。翻譯