【GO】panic: reflect.Value.Interface: cannot return value obtained from unexported field or method

錯誤翻譯理解

不能返回字段或者方法的值微信

報錯代碼

定義倆個結構體,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中對於結構體的屬性訪問方式不明確。翻譯

博主微信歡迎交流

在這裏插入圖片描述

相關文章
相關標籤/搜索