揭示内部工作原理:为什么 fmt.Println 绕过结构体的 String() 方法
关于 fmt.Println 的功能出现了一个有趣的观察结果当调用结构体对象时。虽然人们可能预期会为每个成员调用 String() 方法,但实际情况并非如此。检查这种差异将揭示这种行为背后的根本原因。
根本原因
要了解为什么 fmt.Println 会跳过结构成员的 String() 方法,必须考虑两个关键因素:
解决方法
要纠正此问题并启用 fmt.Println 对结构成员使用 String() 方法,需要进行一些修改必要:
通过实现这些更改,fmt.Println 将获得对 String() 方法和导出字段的访问权限,使其能够生成所需的内容输出:
package main import ( "fmt" ) type Bar struct { } func (b Bar) String() string { return "bar" } type Foo struct { B []Bar BB Bar } func main() { f := Foo{B: []Bar{Bar{}}, BB: Bar{}} fmt.Println(f) }
输出:
{[bar] bar} [bar] bar
结论
导出状态和字段可访问性限制的理解Go 中的文档阐明了为什么 fmt.Println 本质上不使用 String() 方法作为结构成员。通过适当的导出约定解决这些问题,可以实现所需的行为,从而促进代码的清晰度和一致性。
以上是为什么 `fmt.Println` 不在 Go 中的结构成员上调用 `String()` 方法?的详细内容。更多信息请关注PHP中文网其他相关文章!