理解 fmt.Println 对结构体成员的行为
在 Go 中,当我们在结构体上调用 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, f.b, f.bb) }
在此代码中,我们使用 String() 方法定义一个 bar 类型,该方法返回字符串“bar” ”。我们还定义了一个带有字段 b 和 bb 的 foo 类型,它们分别是切片和指向 bar 类型的指针。
当我们在 f、f.b 和 f.bb 上调用 fmt.Println 时,我们得到以下输出:
{[0x176f44] 0x176f44} [bar] bar
这和我们想象的不一样,是:
{[bar] bar} [bar] bar
fmt.Println 行为背后的原因
fmt.Println 在调用时不使用成员的 String() 方法有几个原因在结构体上:
解决方案
要解决此问题,我们需要确保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
以上是为什么 fmt.Println 在 Go 中不使用 Struct 的成员 String() 方法?的详细内容。更多信息请关注PHP中文网其他相关文章!