Golang泛型:探索编程的新纪元
发表时间: 2024-06-06 16:25
Golang泛型的历史可以追溯到2016年。在Go语言的演进过程中,对于泛型的需求一直存在,但是直到Go 1.18版本才正式支持了泛型。
Go 1.18版本中引入了泛型的设计草案,并且提供了一种新的关键字 any 用于声明泛型函数和方法。这标志着Go语言正式迈入了泛型时代,为开发者们提供了更加强大和灵活的编程工具
让我们先来看一个简单的例子。假设你想写一个函数,能够打印出任意类型的数据,不管是整数、浮点数还是字符串。使用泛型,你可以轻松实现:
package mainimport "fmt"func Print[T any](data T) { fmt.Println(data)}func main() { Print(42) // 输出:42 Print(3.14) // 输出:3.14 Print("Hello, Go!") // 输出:Hello, Go!}
是不是很神奇?泛型让你可以处理各种类型的数据,无需重复编写代码!
package mainpackage mainimport "fmt"// 定义一个泛型的栈数据结构type Stack[T any] []T// 入栈操作func (s *Stack[T]) Push(item T) { *s = append(*s, item)}// 出栈操作func (s *Stack[T]) Pop() (any, bool) { if len(*s) == 0 { return nil, false } item := (*s)[len(*s)-1] *s = (*s)[:len(*s)-1] return item, true}func main() { // 创建一个存储整数的栈 var intStack Stack[int] intStack.Push(1) intStack.Push(2) intStack.Push(3) // 创建一个存储字符串的栈 var stringStack Stack[string] stringStack.Push("apple") stringStack.Push("banana") stringStack.Push("cherry") // 出栈并打印结果 for { item, ok := intStack.Pop() if !ok { break } fmt.Println(item) } //打印string栈中的结果 for { item, ok := stringStack.Pop() if !ok { break } fmt.Println(item) }}
上述示例定义了一个名为 Stack 的泛型结构体,它可以存储任意类型的元素。Push 方法用于向栈中压入元素,而 Pop 方法用于从栈中弹出元素。在 main 函数中,我们分别创建了一个存储整数和一个存储字符串的栈,并对它们进行了入栈和出栈操作。