美文网首页Go语言学习联盟
Golang接口赋值和方法集

Golang接口赋值和方法集

作者: Rnben | 来源:发表于2019-03-10 15:59 被阅读49次

    比如《Go语言实战》中的一个例子:

    // compile error
    // cannot use u (type user) as type notifier in argument to sendNotification:
    // user does not implement notifier (notify

    package main
    
    import "fmt"
    
    type user struct {
        name  string
        email string
    }
    type notifier interface {
        notify()
    }
    
    func (u *user) notify() {
        fmt.Printf("sending user email to %s<%s>\n",
            u.name,
            u.email)
    }
    func sendNotification(n notifier) {
        n.notify()
    }
    
    func main() {
        u := user{
            name:  "stormzhu",
            email: "abc@qq.com",
        }
        sendNotification(u) 
    }
    // compile error
    // cannot use u (type user) as type notifier in argument to sendNotification:
    //  user does not implement notifier (notify method has pointer receiver)
    

    如何判断类型是否实现了某个接口?

    1. 接口的定义
    type iface struct {
        tab  *itab          // 类型信息
        data unsafe.Pointer //实际对象指针
    }
    type itab struct {
        inter *interfacetype // 接口类型
        _type *_type         // 实际对象类型
        fun   [1]uintptr     // 实际对象方法地址
    }
    

    对一个接口赋值的时候,会拷贝类型信息和该类型的方法集。只要这个类型的方法集中包括这个接口的所有方法,那么它就是实现了这个接口,才能够赋值给这个接口。

    1. 方法集
    • 类型T的方法集包含所有 receiver T方法。
    • 类型*T的方法集包含所有 receiver T + *T方法。
    • 匿名嵌入S,类型T的方法集包含所有 receiver T + S方法。
    • 匿名嵌入*S,类型T的方法集包含所有 receiver T + S + *S方法。
    • 匿名嵌入S*S,类型*T的方法集包含所有 receiver T + *T + S + *S方法。

    总结:

    1. T*T不是一个类型,他们的方法集不同
    2. 类型*T的方法集包含所有 receiver T + *T方法,类型T的方法集只包含所有 receiver T方法。

    相关文章

      网友评论

        本文标题:Golang接口赋值和方法集

        本文链接:https://www.haomeiwen.com/subject/zpaupqtx.html