[Golang]通过interface实现"泛型"的用例
package main
import (
"errors"
"fmt"
)
var (
ERR_ELEM_EXISTS = ("element exits.")
ERR_ELEM_NOT_EXISTS = ("element not exits.")
)
// 定义切片,支持interface{}类型
// 假设该slice不支持存储相同元素
type SomeSlice []interface{}
// 初始化slice实例
func NewSomeSlice() SomeSlice {
return make(SomeSlice, 0)
}
// 定义一个用于对比的接口
type Comparable interface {
IsEqual(a interface{}) bool
}
// 定义struct类型
type Employee struct {
Id int32
Name string
}
// Employee类型实现了Comparable接口
func (em Employee) IsEqual(b interface{}) bool {
if em2, ok := b.(Employee); ok {
return ==
} else {
return false
}
}
// isEqual函数用于各种类型之间的比较
func isEqual(a, b interface{}) bool {
if cmpa, ok := a.(Comparable); ok {
return (b)
} else if cmpb, ok := b.(Comparable); ok {
return (a)
} else {
return a == b
}
}
// 向slice添加元素
func (ss *SomeSlice) Add(elem interface{}) error {
for _, v := range *ss {
if isEqual(v, elem) {
("[Error]Cannot add the same element: %v\n", elem)
return ERR_ELEM_EXISTS
}
}
*ss = append(*ss, elem)
return nil
}
//从slice中删除元素
func (ss *SomeSlice) Remove(elem interface{}) error {
for k, v := range *ss {
if isEqual(v, elem) {
if k == len(*ss)-1 {
*ss = (*ss)[:k]
} else {
*ss = append((*ss)[:k], (*ss)[k+1:]...)
}
return nil
}
}
("[Error]No such element: %v\n", elem)
return ERR_ELEM_NOT_EXISTS
}
func main() {
// 初始化slice
slice := NewSomeSlice()
// 正常情况下添加不同类型元素
(5)
("huahua")
(Employee{Id: 123, Name: "xiaohong"})
(10)
("xiaoming")
(Employee{Id: 456, Name: "xiaogang"})
("After Add, Current Slice:", slice)
// 添加了重复的元素
(10)
("huahua")
(Employee{Id: 456, Name: "xiaogang"})
("After invalid Add, Current Slice:", slice)
// 正常情况下删除元素
(5)
("huahua")
(Employee{Id: 456, Name: "xiaogang"})
("After Remove, Current Slice:", slice)
// 删除并不存在的元素
(11)
("somename")
(Employee{Id: 789, Name: "dajiu"})
("After invalid Remove, Current Slice:", slice)
}