Go语言中的切片(slice)和一些内置函数能实现其他语言容器类Array、Vector的功能,但是Go内置语言包container里只提供了list、heap、ring三种容器,缺少vector容器,在实际的项目中为使用方便有必要包装一个vector,提供vector的常见功能。
C++、Java、C#等语言支持泛型,Go语言不支持泛型,可以用 interface{} 提供类似泛型的支持。下面是vector容器代码
package vector import "reflect" // 小写 只能通过工厂函数创建 type vector struct { value []interface{} } // 创建工厂函数 func New(cap int) *vector { this := new(vector) this.value = make([]interface{}, 0, cap) return this } // 全部移除 func (this *vector) RemoveAll() { // 重置为 nil 防止内存泄漏 for i := 0; i < this.Len(); i++ { this.value[i] = nil } this.value = this.value[0:0] } func (this *vector) IsEmpty() bool { return len(this.value) == 0 } // 元素数量 func (this *vector) Len() int { return len(this.value) } // 末尾追加 func (this *vector) Append(value interface{}) bool { this.value = append(this.value, value) return true } // 插入 func (this *vector) Insert(index int, value interface{}) bool { if index < 0 || index >= len(this.value) { return false } rear := append([]interface{}{}, this.value[index:]...) this.value = append(append(this.value[:index], value), rear...) return true } // 移除 func (this *vector) Remove(index int) bool { if index < 0 || index >= len(this.value) { return false } // 重置为 nil 防止内存泄漏 this.value[index] = nil this.value = append(this.value[:index], this.value[index+1:]...) return true } func (this *vector) getIndex(value interface{}) int { for i := 0; i < len(this.value); i++ { if reflect.DeepEqual(this.value[i], value) { return i } } return -1 } // 是否存在该元素值 func (this *vector) Contains(value interface{}) bool { return this.getIndex(value) >= 0 } // 获取元素值第一次出现的索引 func (this *vector) IndexOf(value interface{}) int { return this.getIndex(value) } // 获取元素值最后一次出现的索引 func (this *vector) LastIndexOf(value interface{}) int { for i := len(this.value) - 1; i >= 0; i-- { if reflect.DeepEqual(this.value[i], value) { return i } } return -1 } // 得到索引对应的元素值 func (this *vector) GetValue(index int) interface{} { if index < 0 || index >= len(this.value) { return nil } return this.value[index] } // 设置值 func (this *vector) SetValue(index int, value interface{}) bool { if index < 0 || index >= len(this.value) { return false } this.value[index] = value return true }