加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 19:22:14 所属栏目:大数据 来源:网络整理
导读:请原谅我的速度慢,但我不明白何时调用Interface方法.我在Go Tour中看到这个例子: package mainimport "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() {
请原谅我的速度慢,但我不明白何时调用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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读