goport接口的未导出字段或方法

时间:2014-07-30 07:35:40

标签: go

我很新,我试图遍历界面的每个字段(可以是不同的结构)但我不确定下面的代码出了什么问题?它报告运行时错误:panic:reflect.Value.Interface:无法返回从未导出的字段或方法获得的值

那些未导出的领域/方法是什么?我有SomeField字段大写谢谢

type SomeStruct struct {
SomeField   uint32
}

func test(obj interface{}){
  typ := reflect.TypeOf(obj)
  val := reflect.ValueOf(obj)
  for i := 0; i < typ.NumField(); i++ {
    fieldValue := val.Field(i).Interface()
    fmt.Println(fieldValue)
  }
}

func test1(obj interface{}){
  val := reflect.ValueOf(obj)
  test(val)
}

func main() {
  var ss SomeStruct
  test1(ss)
}

2 个答案:

答案 0 :(得分:2)

我想你只是想这样做:

package main

import "fmt"
import "reflect"

type SomeStruct struct {
SomeField   uint32
}

func test(obj interface{}){
  typ := reflect.TypeOf(obj)
  val := reflect.ValueOf(obj)
  for i := 0; i < typ.NumField(); i++ {
    fieldValue := val.Field(i).Interface()
    fmt.Println(fieldValue)
  }
}

func main() {
  var ss SomeStruct
  test(ss)
  ss.SomeField = 1
  test(ss)
}

您的原始代码会尝试获取val := reflect.ValueOf(ss)而不是ss的每个字段的值。

答案 1 :(得分:2)

在Go struct中,以小写字母开头的字段表示其范围是私有的,而大写字母表示公共字段。因此,您应该使字段以UpperCase alpha开头。