gpt4 book ai didi

go - 使用值或指针接收器实现 Stringer 接口(interface)

转载 作者:IT王子 更新时间:2023-10-29 01:53:52 24 4
gpt4 key购买 nike

<分区>

我尝试在我的类型上实现 Stringer 接口(interface),如下所示:

package main

import (
"fmt"
)

type IPAddr [4]byte

// TODO: Add a "String() string" method to IPAddr.
func (o IPAddr) String() string {
return fmt.Sprintf("%v.%v.%v.%v", o[0], o[1], o[2], o[3])
}

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)
fmt.Printf("%v\n", ip.String())
}
}

在上面的代码中,我使用了一个值接收器来实现 String() 方法。 Printf 识别了我的实现并在我的类型上调用了正确的 String 函数。

输出:

googleDNS: 8.8.8.8
8.8.8.8
loopback: 127.0.0.1
127.0.0.1

然后我更新了我的代码以使用指针接收器:

func (o *IPAddr) String() string {
return fmt.Sprintf("%v.%v.%v.%v", o[0], o[1], o[2], o[3])
}

更新代码的输出:

loopback: [127 0 0 1]
127.0.0.1
googleDNS: [8 8 8 8]
8.8.8.8

Printf 方法不再调用我的 String 方法。输出告诉我 Printf 使用类型的默认 String 方法。但是,当我调用ip.String()时,使用了我的方法。

有人可以向我解释一下这种行为吗?据我所知,我们可以通过值和指针接收器来实现接口(interface)的方法。

谢谢。

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