ToB企服应用市场:ToB评测及商务社交产业平台

标题: Go泛型简介 [打印本页]

作者: 不到断气不罢休    时间: 2023-8-9 23:49
标题: Go泛型简介
Go语言的泛型是在Go 1.18版本中引入的一个新特性,它允许开发者编写可以处理不同数据类型的代码,而无需为每种数据类型都编写重复的代码。以下是关于Go语言泛型的一些关键点:
以下是一些使用Go语言泛型的示例:
1. 泛型函数

接受一个类型参数T,并返回T类型的切片中的第一个元素。
  1. package main
  2. import "fmt"
  3. func First[T any](s []T) (T, bool) {
  4.     if len(s) == 0 {
  5.         var zero T
  6.         return zero, false
  7.     }
  8.     return s[0], true
  9. }
  10. func main() {
  11.     fmt.Println(First[int]([]int{1, 2, 3}))
  12.     fmt.Println(First[string]([]string{"Hello", "World"}))
  13. }
复制代码
2. 泛型类型

定义了一个可以存储任何类型元素的栈。
  1. package main
  2. import "fmt"
  3. type Stack[T any] []T
  4. func (s *Stack[T]) Push(v T) {
  5.     *s = append(*s, v)
  6. }
  7. func (s *Stack[T]) Pop() (T, bool) {
  8.     if len(*s) == 0 {
  9.         var zero T
  10.         return zero, false
  11.     }
  12.     index := len(*s) - 1
  13.     element := (*s)[index]
  14.     *s = (*s)[:index]
  15.     return element, true
  16. }
  17. func main() {
  18.     s := Stack[int]{}
  19.     s.Push(1)
  20.     s.Push(2)
  21.     s.Push(3)
  22.     fmt.Println(s.Pop())
  23.     fmt.Println(s.Pop())
  24.     fmt.Println(s.Pop())
  25. }
复制代码
3. 自定义约束

定义了一个函数,该函数接受一个实现了Stringer接口的类型参数。
  1. package main
  2. import (
  3.     "fmt"
  4.     "strconv"
  5. )
  6. type Stringer interface {
  7.     String() string
  8. }
  9. func Print[T Stringer](s T) {
  10.     fmt.Println(s.String())
  11. }
  12. type MyInt int
  13. func (m MyInt) String() string {
  14.     return strconv.Itoa(int(m))
  15. }
  16. func main() {
  17.     Print[MyInt](MyInt(10))
  18. }
复制代码
在这个例子中,Print函数接受一个实现了Stringer接口的类型参数。MyInt类型实现了Stringer接口,所以我们可以将MyInt类型的值传递给Print函数。
  
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
author: mengbin
blog: mengbin
github: mengbin92
cnblogs: 恋水无意

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4