[Golang]通过interface实现"泛型"的用例

时间:2025-02-25 19:48:17
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) }