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 方法。

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

查看所有标签

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

一本书读懂24种互联网思维

一本书读懂24种互联网思维

安杰 / 台海出版社 / 2015-3-1 / 39.80元

互联网思维已经不再局限于互联网,与当初人类史上的“文艺复兴”一样,这种思维的核心即将开始扩散开去,对整个大时代造成深远的影响。本书是深入研究互联网思维的精华之作,作者深入浅出地集中阐述了24种互联网思维的内核与精神,并结合实例对这24种互联网思维逐一进行了点评。对于个人与企业如何抓住互联网思维背后正喷薄而出的工作、生活、商业上的大革新与大机遇,如何在互联网思维下进行运作,如何运用互联网思维进行升级......一起来看看 《一本书读懂24种互联网思维》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具