【Golang 基础】Go 语言的接口

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

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群:701969077

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