首页  >  文章  >  后端开发  >  为什么 `fmt.Println` 不在 Go 中的结构成员上调用 `String()` 方法?

为什么 `fmt.Println` 不在 Go 中的结构成员上调用 `String()` 方法?

DDD
DDD原创
2024-11-27 06:13:10180浏览

Why Doesn't `fmt.Println` Call `String()` Methods on Struct Members in Go?

揭示内部工作原理:为什么 fmt.Println 绕过结构体的 String() 方法

关于 fmt.Println 的功能出现了一个有趣的观察结果当调用结构体对象时。虽然人们可能预期会为每个成员调用 String() 方法,但实际情况并非如此。检查这种差异将揭示这种行为背后的根本原因。

根本原因

要了解为什么 fmt.Println 会跳过结构成员的 String() 方法,必须考虑两个关键因素:

  1. 导出状态: 为 bar 类型定义的 String() 方法未导出,以小写字母开头。这可以防止其他包或代码模块访问它,从而使其不可用于 fmt.Println。
  2. 未导出的字段: foo 结构体中的字段(b 和 bb)也未导出,呈现它们对外部代码不可见。因此,fmt.Println 无法直接访问这些字段来调用其 String() 方法。

解决方法

要纠正此问题并启用 fmt.Println 对结构成员使用 String() 方法,需要进行一些修改必要:

  1. 导出类型: 通过大写首字母将 Bar(以前称为 bar)声明为导出类型。
  2. 导出字段: 将字段 B 和 BB 导出,名称以大写开头字母。
  3. String() 方法: 为 Bar(以前称为 bar)实现 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中文网其他相关文章!

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