为什么我的Golang定义方法没有在String()时隐式实现

时间:2018-11-21 00:02:14

标签: go

https://tour.golang.org/methods/11

状态表示,可以将接口值视为值和具体类型的元组

我将M定义如下

脚本1

package main

import (
    "fmt"
)

type I interface {
    M() string
}
type T struct {
    S string
    w string
}
func (t T) M() string {
    return "dddd"
}
func main() {
    var i I
    i = T{"Hello","eeee"}  
    fmt.Printf("(%v, %T)", i, i)    
    fmt.Println(i)
}

这将打印出({Hello eee}, main.T){Hello eee} 界面我有有效的{Hello eee}并键入main.T

脚本2:

package main

import (
    "fmt"
)

type I interface {
    M() string
}
type T struct {
    S string
    w string
}
func (t T) M() string {
    return "dddd"
}
func (t T) String() string {
    return "ccccc"
}
func main() {
    var i I
    i = T{"Hello","eeee"}
    fmt.Printf("(%v, %T)", i, i) 
    fmt.Println(i)
}

这将打印出(ccccc, main.T)ccccc

接口我有有效的ccccc并键入main.T

当我将String()作为由script2中的fmt包定义的Stringer添加时,似乎出现了。 String()是隐式实现的,不确定为什么吗?

我认为在script2中,我将具有“ {Hello eee}”值,并键入main.T

2 个答案:

答案 0 :(得分:0)

您应该致电fmt.Println(i.M())吗?
为什么要fmt调用一个不存在的函数?

Stringer是一种可以将自己描述为字符串的类型。 fmt程序包(以及许多其他程序包)正在寻找此界面来打印值

答案 1 :(得分:0)

引用:https://golang.org/pkg/fmt/#Stringer

  

Stringer由具有String方法的任何值实现,   定义该值的“本机”格式。使用String方法   打印作为操作数传递的值,使其接受任何格式   字符串或未格式化的打印机(例如“打印”)。

在您的情况下,在script1中,您只是打印出该结构。在script2中,您提供了生成无格式打印时构建器应该使用的功能,该功能可以打印出“ ccccc”。