6. 接口

6.1 定义

type Name interface { // Name 一般会在单词后面添加 er,大写表示公有,小写表示私有
    方法名1(参数列表1) 返回值列表1
    ...
}

6.2 实现

import (
    "fmt"
)

// 定义一个数据写入器
type DataWriter interface {
    WriteData(data interface{}) error
}

// 定义文件结构,用于实现 DataWriter
type file struct {
}

// 实现 DataWriter 接口的 WriteData 方法
func (d *file) WriteData(data interface{}) error {
    // 模拟写入数据
    fmt.Println("WriteData:", data)
    return nil
}

func main() {
    // 实例化 file
    f := new(file)
    // 声明一个 DataWriter 的接口
    var writer DataWriter
    // 将接口赋值f,也就是 *file 类型
    writer = f
    // 使用 DataWriter 接口进行数据写入
    writer.WriteData("data")
}

一个接口的方法,不一定需要由一个类型完全实现,接口的方法可以通过在类型中嵌入其他类型或者结构体来实现。

import "fmt"

// 一个服务需要满足能够开启和写日志的功能
type Service interface {
    Start()     // 开启服务
    Log(string) // 日志输出
}

// 日志器
type Logger struct {
}

// 实现Service的Log()方法
func (g *Logger) Log(l string) {
    fmt.Println(l)
}

// 游戏服务
type GameService struct {
    Logger // 嵌入日志器
}

// 实现 Service的Start()方法
func (g *GameService) Start() {
    fmt.Println("start")
}

func main() {
    var s Service = new(GameService)
    s.Start()
    s.Log("hello")
}

6.3 排序

一个内置的排序算法需要知道三个东西:序列的长度,表示两个元素比较的结果,一种交换两个元素的方式;这就是 sort.Interface 的三个方法:

import (
    "fmt"
    "sort"
)

type MyStringList []string

func (m MyStringList) Len() int {
    return len(m)
}

func (m MyStringList) Less(i, j int) bool {
    return m[i] < m[j]
}

func (m MyStringList) Swap(i, j int) {
    m[i], m[j] = m[j], m[i]
}

func main() {
    names := MyStringList{
        "3. Triple Kill",
        "5. Penta Kill",
        "2. Double Kill",
        "4. Quadra Kill",
        "1. First Blood",
    }
    sort.Sort(names)// GoLand: alt + enter 快速实现接口

    for _, v := range names {
        fmt.Printf("%s\n", v)
    }
}

6.4 接口和类型之间的转换

// t, ok := i.(T)
// 如果一个类型断言中的断言值是一个零值 nil 接口值,则此断言必定失败。

// 编译器将把123的类型推断为内置类型int。
var x interface{} = 123

// 情形一:
n, ok := x.(int)
fmt.Println(n, ok) // 123 true
n = x.(int)
fmt.Println(n) // 123

// 情形二:
a, ok := x.(float64)
fmt.Println(a, ok) // 0 false

// 情形三:
a = x.(float64) // 将产生一个 panic

results matching ""

    No results matching ""