Golang接口赋值和方法集

栏目: Go · 发布时间: 7年前

内容简介:比如《Go语言实战》中的一个例子:如何判断类型是否实现了某个接口?对一个接口赋值的时候,会拷贝类型信息和该类型的方法集。只要这个类型的方法集中包括这个接口的所有方法,那么它就是实现了这个接口,才能够赋值给这个接口。

比如《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 方法。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

腾讯传

腾讯传

吴晓波 / 浙江大学出版社 / 2017-1-1 / 58.00元

腾讯官方唯一授权的权威传记 著名财经作家吴晓波倾力之作 当市值最高的中国互联网公司,遇上中国财经界最冷静的一双眼睛 读懂腾讯,读懂中国互联网 . 内容简介 本书全景式地记录了腾讯崛起的经历,并以互联网的视角重新诠释了中国在融入全球化进程中的曲折与独特性。 从1998年开始创业到成为世界级互联网巨头,腾讯以即时通信工具起步,逐渐进入社交网络、互动娱乐、网络媒......一起来看看 《腾讯传》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换