这个问题在这里已有答案:

我理解为什么我的方法签名不能用指针接收器 func (i *IPAddr) String() string 来实现 fmt.Stringer 接口 . 我虽然Golang会为我做(&i).String() - > i.String()魔术 . 但是,看起来 fmt.Printf 并未将其视为有效的Stringer实现 . 为什么?

完整代码:

package main

import "fmt"

type IPAddr [4]byte

func (i *IPAddr) String() string {
    return fmt.Sprintf("%d.%d.%d.%d", i[0], i[1], i[2], i[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("%s", ip.String()) // Test
    }
}