登录
首页 >  Golang >  Go问答

为何 Golang 中的方法没有隐式实现,但 String() 方法却有隐式实现

来源:stackoverflow

时间:2024-03-11 16:06:29 328浏览 收藏

从现在开始,努力学习吧!本文《为何 Golang 中的方法没有隐式实现,但 String() 方法却有隐式实现》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!

问题内容

在 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} 接口 i 有 vaule {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

接口 i 有 vaule ccccc 和类型 main.t

似乎当我添加 string() 作为由 script2 中的 fmt 包定义的 stringer 时。 string() 是隐式实现的,不知道为什么?

我认为在 script2 中我会有值“{hello eee}”并输入 main.t


解决方案


你应该调用 fmt.Println(i.M())
为什么您希望 fmt 在函数存在时调用该函数?

Stringer 是一种可以将自身描述为字符串的类型。 fmt 包(以及许多其他包)寻找此接口来打印值

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>