如何在打印Go语言Zoo列表时输出Animal枚举的名称?
解决打印Zoo列表时输出Animal枚举名称的问题
问题出在两个关键点:
Group结构体的a、b是未导出的小写字段,fmt包无法访问私有字段的类型方法,只能输出其底层整数值;Group或Zoo没有自定义格式化方法,导致切片打印时使用默认的结构体输出格式。
下面提供两种实用解决方案:
方案一:导出Group的字段
将Group中的小写字段改为大写(Go语言中大写开头的字段为导出字段),这样fmt就能调用Animal的String()方法输出枚举名称:
type Group struct { A, B Animal // 改为导出字段 }
修改后运行代码,fmt.Println(z1)会输出:[{Goat Cat} {Dog Cat}]
方案二:给Group实现String()方法
如果不想导出字段,可以给Group类型自定义String()方法,手动格式化输出两个Animal的名称:
func (g Group) String() string { return fmt.Sprintf("{%s %s}", g.a, g.b) }
这种方式利用包内访问权限,直接调用私有字段的String()方法,打印z1时同样会输出正确的枚举名称。
可选:给Zoo实现自定义格式化(进阶)
如果需要更定制化的切片输出格式,可以给Zoo类型实现String()方法:
import "strings" func (z Zoo) String() string { var sb strings.Builder sb.WriteString("[") for idx, group := range z { if idx != 0 { sb.WriteString(" ") } sb.WriteString(fmt.Sprintf("{%s %s}", group.a, group.b)) } sb.WriteString("]") return sb.String() }
内容的提问来源于stack exchange,提问作者R71
相关产品推荐
相关产品推荐

