首页  >  文章  >  后端开发  >  为什么 `fmt.Println` 不使用我的 Struct 的 `String()` 方法?

为什么 `fmt.Println` 不使用我的 Struct 的 `String()` 方法?

Susan Sarandon
Susan Sarandon原创
2024-11-22 05:03:15375浏览

Why Doesn't `fmt.Println` Use My Struct's `String()` Method?

揭开谜底:为什么 fmt.Println 会跳过结构体中的 String() 方法

想象一个困境:为结构体定义一个 String() 方法来提供自定义打印行为,但 fmt.Println 似乎忽略它,导致输出不可读。以下代码就是这种情况:

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)
}

预期输出:

{bar bar} [bar] bar

实际输出:

{[0x176f44] 0x176f44} [bar] bar

揭开原因

这背后有两个关键因素行为:

  • 未导出类型: bar 类型未导出,这意味着它只能在同一包中使用。当未导出的类型嵌入到像 foo 这样的导出结构中时,它们的方法也不会被导出。
  • 未导出的字段: foo 中的字段 b 和 bb 是未导出的,这意味着它们的 String() 方法不能通过 fmt.Println 访问。

照亮解决方案

要解决此问题,我们需要导出 bar 类型和 foo 字段。这是更正后的代码:

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)
}

Playground:https://play.golang.org/p/OhoIcB7cA3

这确保了 Bar 及其 String() 方法都被导出,从而允许fmt.Println 来利用它。因此,我们获得了所需的输出:

{bar bar} [bar] bar

总之,请记住导出 String() 方法中涉及的类型和字段,以使 fmt.Println 能够利用这种强大的自定义格式化功能。

以上是为什么 `fmt.Println` 不使用我的 Struct 的 `String()` 方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn