首页 > 后端开发 > Golang > 正文

为什么 fmt.Println 在 Go 中不使用 Struct 的成员 String() 方法?

Mary-Kate Olsen
发布: 2024-11-23 07:47:27
原创
914 人浏览过

Why Doesn't fmt.Println Use a Struct's Member String() Methods in Go?

理解 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() 方法不是Exported: bar 类型中的 String() 方法不会导出,因为它以小写字母开头。导出的类型和方法可以从其他包访问,而未导出的则不能。
  • 字段未导出: foo 类型中的字段 b 和 bb 也未导出,因为它们以小写字母开头。因此,它们无法从其他包访问,也不会被 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
登录后复制
登录后复制

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板