微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Golang:在哪里调用接口方法?

请原谅我的速度慢,但我不明白何时调用Interface方法.我在Go Tour中看到这个例子:
package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func (p Person) String() string {
    return fmt.Sprintf("%v (%v years)",p.Name,p.Age)
}

func main() {
    a := Person{"Arthur Dent",42}
    z := Person{"Zaphod Beeblebrox",9001}
    fmt.Println(a,z)
}

我知道func(p Person)接收String()方法并返回我想要显示的字符串.

但是在某个地方,main()中的fmt.Println必须以某种方式调用String(),对吧?

我看了一下godoc fmt的来源,但我还是想不出来!

例如,如果我添加自己的接口,让我们说Stringer2使用方法String2()并创建一个func(p Person)String2(){….},那么String()如何被fmt.Println执行,但不是String2()?

我知道,我很困惑自己!

该值作为接口{}传递给Println,并检查它是否通过 “type assertion”通常以 “type switch”的形式满足fmt.Stringer接口.
func Isstringer(i interface{}) {
    switch s := i.(type) {
    case fmt.Stringer:
        fmt.Println("Person a has a String() method")
        fmt.Println(s.String())
    default:
        fmt.Println("not a stringer")
    }

    // OR for a single type

    if s,ok := i.(fmt.Stringer); ok {
        fmt.Println("Person a has a String() method")
        fmt.Println(s.String())
    }
}

但是,从fmt软件包打印时,其他方法可能优先.首先检查fmt.Formatter,fmt.GoStringer,错误,然后最后检查fmt.Stringer.

原文地址:https://www.jb51.cc/go/186932.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐