泛型是编程语言中支持多种数据类型操作的特性。在Go语言中,泛型的概念是通过接口和反射机制来实现的。泛型不是Go语言的一部分,但是可以通过一些技巧来模拟实现。
以下是一个简单的泛型示例,使用接口实现一个简单的栈结构:
package main
import "fmt"
// 定义一个接口,可以容纳任何类型
type StackInterface[T any] interface {
Push(T)
Pop() T
IsEmpty() bool
}
// 实现一个int类型的栈
type IntStack struct {
stack []int
}
func (s *IntStack) Push(v int) {
s.stack = append(s.stack, v)
}
func (s *IntStack) Pop() int {
if s.IsEmpty() {
panic("stack is empty")
}
v := s.stack[len(s.stack)-1]
s.stack = s.stack[:len(s.stack)-1]
return v
}
func (s *IntStack) IsEmpty() bool {
return len(s.stack) == 0
}
// 实现一个string类型的栈
type StringStack struct {
stack []string
}
func (s *StringStack) Push(v string) {
s.stack = append(s.stack, v)
}
func (s *StringStack) Pop() string {
if s.IsEmpty() {
panic("stack is empty")
}
v := s.stack[len(s.stack)-1]
s.stack = s.stack[:len(s.stack)-1]
return v
}
func (s *StringStack) IsEmpty() bool {
return len(s.stack) == 0
}
func main() {
// 创建一个int类型的栈
intStack := &IntStack{}
intStack.Push(1)
fmt.Println(intStack.Pop())
// 创建一个string类型的栈
stringStack := &StringStack{}
stringStack.Push("hello")
fmt.Println(stringStack.Pop())
}
在这个示例中,我们定义了一个名为StackInterface
的接口,它可以容纳任何类型T
。然后,我们为int
和string
类型分别实现了栈结构体,并且确保它们遵守了StackInterface
接口的约定。这样,我们就能够创建多种类型的栈,并且可以在不同类型的栈之间重用相同的代码。这就是泛型的一个简单示例。