Golang泛型:探索编程的新纪元

发表时间: 2024-06-06 16:25

Golang泛型的历史可以追溯到2016年。在Go语言的演进过程中,对于泛型的需求一直存在,但是直到Go 1.18版本才正式支持了泛型。

Go 1.18版本中引入了泛型的设计草案,并且提供了一种新的关键字 any 用于声明泛型函数和方法。这标志着Go语言正式迈入了泛型时代,为开发者们提供了更加强大和灵活的编程工具

1. 基础用法:

让我们先来看一个简单的例子。假设你想写一个函数,能够打印出任意类型的数据,不管是整数、浮点数还是字符串。使用泛型,你可以轻松实现:

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 函数中,我们分别创建了一个存储整数和一个存储字符串的栈,并对它们进行了入栈和出栈操作。