分享
  1. 首页
  2. 文章

【Golang 基础】Go 语言的接口

爱写作的程序猿 · · 1855 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Go 语言中的接口

Go 语言中的接口就是方法签名的集合,接口只有声明,没有实现,没有数据字段。

  • 只要某个类型拥有了该接口的所有方法,即该类型就算实现了该接口,无需显式声明实现了哪个接口,这被称为 Structurol Typing;
package main
import "fmt"
// 定义 Usb 接口
type Usb interface {
 GetName() string
 Connection()
}
// 定义 Phone 结构
type Phone struct {
 Name string
}
// 实现 Usb 接口的 GetName 方法
func (p Phone) GetName() string {
 return p.Name
}
// 实现 Usb 接口的 Connection 方法
func (p Phone) Connection() {
 fmt.Println("Connection:", p.GetName())
}
func main() {
 iPhone := Phone{Name:"iPhone"}
 fmt.Println(iPhone.GetName()) // iPhone
 iPhone.Connection() // Connection:iPhone
}
  • Go 允许不带任何方法签名的接口,这种类型的接口被称为 empty interface,按照第一条结论,只要某个类型拥有了某个接口的所有方法,那么该类型就实现了该接口,所以所有类型都实现了 empty interface;

  • 当对象赋值给接口时,会发生拷贝。接口内部存储的是指向这个复制品的指针,无法修改其状态,也无法获取指针;

iPhone := Phone{Name: "iPhone"}
var usb = Usb(iPhone)
fmt.Println(iPhone.GetName()) // iPhone
fmt.Println(usb.GetName()) // iPhone
iPhone.Name = "SAMSUNG"
fmt.Println(iPhone.GetName()) // SAMSUNG
fmt.Println(usb.GetName()) // iPhone
  • 接口可以作为任何类型数据的容器。
// 定义调用接口方法
func InvokInterface(inter interface{}) {
 // inter.(type) 用于获取类型
 switch t := inter.(type) {
 case Usb:
 t.Connection()
 case string:
 fmt.Println(t)
 default:
 fmt.Println("Unkown")
 }
}
function main() {
 iPhone := Phone{Name: "iPhone"}
 var usb = Usb(iPhone)
 hello := "Hello World"
 const PI = 3.14
 InvokerInterface(iPhone) // Connection: iPhone
 InvokerInterface(usb) // Connection: iPhone
 InvokerInterface(hello) // Hello World
 InvokerInterface(PI) // Unkown
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:爱写作的程序猿

查看原文:【Golang 基础】Go 语言的接口

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1855 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏