Go语言泛型指南| Go语言泛型教程

silverwq
2023-12-31 / 0 评论 / 111 阅读 / 正在检测是否收录...

从语法的角度来讲,泛型是从接口层面演化而来的。

下面例子中,f1 是依赖于接口类型 Man,f2 是依赖于 T 类型,T 类型等价于 Man 类型。

package main

type Man interface {
    Say()
}

type Student struct {
}

func (s Student) Say() {

}

// 面向接口编程,a必须是Man接口类型
func f1(a Man) {

}

// 泛型,中括号里可以理解为T是Man的别名
// 既然T等Man,所以f1和f2就等价了
func f2[T Man](a T) {

}

func main() {
    f1(Student{})
    f2(Student{})
}

应用在函数里

跟接口的语法有点类似,就是里面的内容是数据类型,而不是方法签名,如下所示 Happy 就是联合类型,将来要使用到 Happy 的时候,只需要用到任意一个类型传递进去就可以。

// 联合类型
type Happy interface {
    // ~T,是go1.18新增的符号,~t表示底层是T的所有类型
    int | ~int32 | int8 | string | ~bool
}

// a,b必须同时为int、~int32、int8、string、 ~bool
// 不可以一个是int,一个是string
func f3[T Happy](a, b T, c float64) {

}

func main() {
    // a,b都是int
    f3(1, 2, 3.1)
    f3(true, false, 3.1)
    f3("a", "b", 3.1)
}

如果不想要定义个结构体,可以如下所示,当然,a, b 两个参数每次调用的时候,也要是同一个类型。

package main

func f4[T int | string | bool](a, b T, c float64) {

}

func main() {
    // a,b都是int
    f4(1, 1, 3.1)
    f4(true, false, 3.1)
    f4("a", "b", 3.1)
}

应用在结构体

在接口体名称后面新增一个中括号,在中括号里设置好别名

package main

import "fmt"

type Happy interface {
    // ~T,是go1.18新增的符号,~t表示底层是T的所有类型
    int | ~int32 | int8 | string | ~bool
}

type Bird[T Happy, S int | string] struct {
    Head T
    Hair S
}

func (b *Bird[T, S]) SetHead(h T) {
    b.Head = h
}

func main() {
    // [int, string],定下来[T, S]是什么
    bird := Bird[int, string]{ 
        Head: 3,
        Hair: "lang",
    }
    fmt.Println(bird.Head, bird.Head)
}
0

评论 (0)

取消