gpt4 book ai didi

Go接收器隐式指针转换不起作用

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

我正在学习围棋,并且正在关注围棋之旅。

在关于 Stringer 的练习中,here ,使用 *IPAddr 接收器实现该功能似乎不起作用,go tour 描述为应该起作用。

package main

import "fmt"

type IPAddr [4]byte

// TODO: Add a "String() string" method to IPAddr.
func (ip *IPAddr) String() string {
return fmt.Sprintf("%v.%v.%v.%v", ip[0], ip[1], ip[2], ip[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)
}
}

输出是:

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

但是将 String() stringfunc (ip *IPAddr) 更改为 func (ip IPAddr) 会给出正确的输出:

loopback: 127.0.0.1
googleDNS: 8.8.8.8

这是为什么?

最佳答案

隐式转换意味着您可以在值或指针上调用函数,但它不满足接口(interface)的实现。如果使用指针接收器实现接口(interface),则必须在函数调用中使用指针。

下面的代码显示了与 Stringer 接口(interface)一起使用的 *IPAddr,以及与新的 foo() 函数一起使用的 IPAddr(也用指针接收器实现):

package main

import "fmt"

type IPAddr [4]byte

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

func (ip *IPAddr) foo() string {
return "bar"
}

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.Println(ip.foo())
}
}

关于Go接收器隐式指针转换不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46626592/

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