Go开发环境安装和配置

header_img

Go 1.18 带来了泛型的特性,现在 Go 1.18 Beta 1 已可已使用,初步体验一下 Go 泛型。

简单使用

  1. 分别写一个 string 类型和 int 类型各自相加的函数

    func AddInt(a, b int) int {
    	return a + b
    }
    
    func AddString(a, b string) string {
    	return a + b
    }
    
    

    现在是用泛型只需要写一个函数就能给解决

    package main
    
    import (
    	"fmt"
    )
    
    func Add[T int | string](a, b T) T {
    	return a + b
    }
    
    func main() {
    	fmt.Println("add ", Add(10, 10)) // 20
    	fmt.Println("add ", Add("10", "10")) // 1010
    }
    
  2. 模仿 new 方法

    package main
    
    import (
    	"fmt"
    )
    
    func New[T any]() *T {
    	return new(T)
    }
    
    func main() {
    	// new 0x1400012c008
    	fmt.Println("new", New[int]())
    }
    
  3. 空接口替换成any

    package main
    
    import (
    	"fmt"
    )
    
    func IntfaceToAny(p any) any {
    	return p
    }
    
    func IntfaceToAny2[T string](str T, args ...any) {
    	fmt.Print(str)
    	for _, v := range args {
    		fmt.Printf("%q", v)
    	}
    }
    
    func main() {
    	str := IntfaceToAny("hello")
    	num := IntfaceToAny(123)
    	IntfaceToAny2("hello ", 'w', 'o', 'r', 'l', 'd')
    
    	fmt.Println("\nany ", str, num)
    
    }
    
  4. 联合类型约束

    package main
    
    import "fmt"
    
    type Number interface {
    	int | int64 | float64
    }
    
    func SumNumbers[K comparable, V Number](m map[K]V) V {
    	var s V
    	for _, v := range m {
    		s += v
    	}
    	return s
    }
    
    func main() {
    	sum := SumNumbers(make(map[string]int64, 0))
    	fmt.Println("sum", sum)
    }
    

    以上例子中 V 的类型Number是一个 int、int64、float64 的联合类型,comparable是 Go 内置类型约束,它的值是可用于比较的任何类型,Go 要求 map 的键具有课比较性,所以这里将 K 的类型约束设置为comparable

  5. 结构体上使用泛型

    package main
    
        import "fmt"
    
        // 结构体 泛型
        type List[T any] struct {
        	Code    int
        	Data    T
        	Message string
        }
    
        func New[T any]() *T {
        	return new(T)
        }
    
        func main() {
        	newList := New[List[[]int]]()
        	fmt.Println("newList", newList)
        	// newList &{0 [] }
        }
        ```
    
    以上是一些简单的用法,泛型可以写很复杂的逻辑,还要等待以后慢慢发掘。