Go泛型学习笔记
Go泛型内容不多可类比C++这种编程语言,共编写了泛型函数,泛型类型、接口约束、处理不同类型的值、处理泛型切片的常见demo举例
文章目录
- 1、泛型函数
- 2、泛型类型
- 3、接口约束
- 4、处理不同类型的值
- 5、处理泛型切片
1、泛型函数
交换两个值
func Swap[T int | int32 | int64](a, b T) (T, T) {
return b, a
}
func main() {
a, b := 1, 2
a, b = Swap(a, b)
fmt.Println(a, b)
x, y := "hello", "world"
x, y = Swap(x, y) //编译不通过,因为泛型没有加入
fmt.Println(x, y)
}
2、泛型类型
package main
import "fmt"
//int | int32 | int64 | float32 | float64
type Stack[T int | int32] struct {
elements []T
}
func (s *Stack[T]) Push(element T) {
s.elements = append(s.elements, element)
}
func (s *Stack[T]) Pop() (T, bool) {
if len(s.elements) == 0 {
var zero T
return zero, false
}
element := s.elements[len(s.elements)-1]
s.elements = s.elements[:len(s.elements)-1]
return element, true
}
func main() {
intStack := &Stack[int]{}
intStack.Push(123)
intStack.Push(456)
fmt.Println(intStack.Pop())
fmt.Println(intStack.Pop())
}
3、接口约束
package main
import "fmt"
type Comparable[T comparable] interface {
Compare(a, b T) int
}
type IntComparator struct{}
func (ic IntComparator) Compare(a, b int) int {
if a < b {
return -1
} else if a > b {
return 1
}
return 0
}
func main() {
ic := IntComparator{}
fmt.Println(ic.Compare(1, 2))
fmt.Println(ic.Compare(3, 4))
fmt.Println(ic.Compare(8, 6))
}
4、处理不同类型的值
package main
import "fmt"
func Add[T, U int | string | float32 | float64](a T, b U) string {
return fmt.Sprintf("%v+%v", a, b)
}
func main() {
fmt.Println(Add(10, 20))
fmt.Println(Add("Hello", 5))
fmt.Println(Add(3.13, 3.74))
}
5、处理泛型切片
package main
import "fmt"
func PrintSlice[T int | int32 | int64 | string](slice []T) {
for _, v := range slice {
fmt.Println(v)
}
}
func main() {
intSlice := []int{1, 2, 3, 4}
stringSlice := []string{"Go", "Lang", "Generics"}
PrintSlice(intSlice)
PrintSlice(stringSlice)
}