IPAddr 类型的字符串方法

package main


import (

    "fmt"

    "strings"

)


type IPAddr [4]byte


func (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()?


至尊宝的传说
浏览 105回答 2
2回答

慕的地8271018

纵梁接口type Stringer interface {     String() string}Stringer 由任何具有 String 方法的值实现,该方法定义了该值的“本机”格式。String 方法用于将作为操作数传递的值打印到任何接受字符串的格式或未格式化的打印机(例如 Print)。因此,当您为该类型定义一个String方法并将该类型的实例传递给fmt.Printf和朋友时,它也会转换为type interface{}您可以从函数签名中看到的值。然后在fmt包中,它检查String该类型的方法是否已定义(意味着它实现了 Stringer 接口)并调用它。因此,我建议您首先阅读有关接口的信息。

胡说叔叔

string 方法是 stringer 接口包的一部分 fmt 查找传递的值以检查输入是否实现了 Stringer 接口,如果实现了,它将在打印时自动调用 stringer 函数由于它基于特定的接口,因此如果它不实现特定的签名,则需要调用固定的方法签名,因此 fmt 包将不会调用字符串方法你可以在这里阅读更多内容 https://golang.org/pkg/fmt/#Stringer
打开App,查看更多内容
随时随地看视频慕课网APP