Golang接口赋值和方法集

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

内容简介:比如《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 方法。

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

查看所有标签

猜你喜欢:

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

Hatching Twitter

Hatching Twitter

Nick Bilton / Portfolio Hardcover / 2013-11-5 / USD 28.95

The dramatic, unlikely story behind the founding of Twitter, by New York Times bestselling author and Vanity Fair special correspondent The San Francisco-based technology company Twitter has become......一起来看看 《Hatching Twitter》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具