package mainimport ( "fmt" "strings")type IPAddr [4]bytefunc (ip IPAddr) String() string { return strings.Trim(strings.Join(strings.Fields(fmt.Sprint([4]byte(ip))), "."), "[]")}func main() { hosts := map[string]IPAddr{ "loopback": {127, 0, 0, 1}, "googleDNS": {8, 8, 8, 8}, } for name, ip := range hosts { fmt.Printf("%v: %v\n", name, ip) }}Q 1:我没有看到对String()方法的任何调用,type IPAddr但它仍然被调用。为什么?Q 2:为什么方法的名称必须是String()而不是Stringa(),Stringb()?
2 回答
慕的地8271018
TA贡献1796条经验 获得超4个赞
type Stringer interface { String() string}
Stringer 由任何具有 String 方法的值实现,该方法定义了该值的“本机”格式。String 方法用于将作为操作数传递的值打印到任何接受字符串的格式或未格式化的打印机(例如 Print)。
因此,当您为该类型定义一个String
方法并将该类型的实例传递给fmt.Printf
和朋友时,它也会转换为type interface{}
您可以从函数签名中看到的值。然后在fmt
包中,它检查String
该类型的方法是否已定义(意味着它实现了 Stringer 接口)并调用它。
因此,我建议您首先阅读有关接口的信息。
胡说叔叔
TA贡献1804条经验 获得超8个赞
string 方法是 stringer 接口包的一部分 fmt 查找传递的值以检查输入是否实现了 Stringer 接口,如果实现了,它将在打印时自动调用 stringer 函数
由于它基于特定的接口,因此如果它不实现特定的签名,则需要调用固定的方法签名,因此 fmt 包将不会调用字符串方法
你可以在这里阅读更多内容 https://golang.org/pkg/fmt/#Stringer
- 2 回答
- 0 关注
- 112 浏览
添加回答
举报
0/150
提交
取消