本文介绍了Golang 1.x版本的泛型编程。
往期回顾:浅谈动态追踪技术
Go是一门天生为服务器程序设计的简洁的语言,因此Go的设计原则聚焦在可扩展性、可读性和并发性,而多态性并不是这门语言的设计初衷,因此就被放在了一边。虽然在2.0版本之前还没有泛型的支持,但是Go自带的一些语言特性可以满足一些类似“泛型”的要求,比如内置类型:
array
slice
map
chan
这四种类型可以用任意类型的元素初始化,例如map[yourtype]bool就可以用来实现任意元素的集合。Go的一些内置函数也是通用的,比如len()既可以用于string, array, slice, 也可以用于求map的长度。
但是如果golang内置结构和函数不能满足需求,可以从以下几种方法来入手:
01
类型断言
当你想实现一个通用函数的时候,会考虑传入的参数是不是固定类型的,Go正好提供了interface{}类型,它可以代表任意类型。当你不确定用什么类型合适的时候,用它就对了。举个简单的例子:
type Container struct {
elem []interface{}
}func (this *Container) Put(v interface{}) {
*this = append(*this, elem)
}// 取出最后一个元素func (this *Container) Get() interface{} {
ret := (*c)[len(*c)-1]
*c = (*c)[:len(*c)-1] return ret
}func assertExample() {
container := &Container{}
container.Put(1)
container.Put("Hello")
_, ok := container.Get().(int);!ok {
fmt.Println("Unable to read an int from container")
}
}