gpt4 book ai didi

go - 为什么 %v 为嵌套结构打印意外值?

转载 作者:数据小太阳 更新时间:2023-10-29 03:38:13 29 4
gpt4 key购买 nike

当打印带有实现了 String() 的嵌套结构的结构时,根据我们的理解,%v 格式会打印一个“意外”值。

下面是代码片段。

package main

import (
"fmt"
)

type Inner struct {
}

type A struct {
Inner
FieldA string
}

func (i Inner) String() string {
return "anything"
}

func main() {
myA := A{FieldA: "A"}
fmt.Printf("%v", myA)
}

我们期望输出是

{anything A}

但实际结果是

anything

为什么会这样?似乎 FieldA 被忽略了?更令人困惑的是,如果我们有两个嵌套结构,其中都实现了 String(),则输出是预期的。

package main

import (
"fmt"
)

type Inner struct {
}

type InnerAgain struct {
}

type A struct {
Inner
InnerAgain
FieldA string
}

func (i Inner) String() string {
return "anything"
}

func (i InnerAgain) String() string {
return "nothing"
}

func main() {
myA := A{FieldA: "A"}
fmt.Printf("%v", myA)
}

输出是

{anything nothing A}

...

最佳答案

由于您正在嵌入 Inner,因此您继承了它的所有属性 - 包括 String() - 函数。所以 %v 实际上是在调用 Inner.String()

来自文档(https://golang.org/pkg/fmt/):

  1. If an operand implements method String() string, that method will be invoked to convert the object to a string, which will then be formatted as required by the verb (if any).

关于go - 为什么 %v 为嵌套结构打印意外值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53048013/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com