github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/algorithm/datastructures/array/array.go (about) 1 package array 2 3 import ( 4 "errors" 5 "fmt" 6 "strings" 7 ) 8 9 /** 10 * 1)数组的插入、删除、按照下标随机访问操作 11 */ 12 type Array struct { 13 data []interface{} 14 length uint 15 } 16 17 func New(capacity uint) *Array { 18 if capacity == 0 { 19 return nil 20 } 21 22 return &Array{ 23 data: make([]interface{}, capacity, capacity), 24 } 25 } 26 27 func (this *Array) Len() uint { 28 return this.length 29 } 30 31 func (this *Array) isIndexOutOfRange(index uint) bool { 32 if index > uint(cap(this.data)) { 33 return true 34 } 35 return false 36 } 37 38 //通过索引查找数组,索引范围[0,n-1] 39 func (this *Array) Find(index uint) (interface{}, error) { 40 if this.isIndexOutOfRange(index) { 41 return 0, errors.New("out of index range") 42 } 43 return this.data[index], nil 44 } 45 46 // 插入 47 func (this *Array) Insert(index uint, v interface{}) error { 48 if this.Len() == uint(cap(this.data)) { 49 return errors.New("full array") 50 } 51 if index != this.length && this.isIndexOutOfRange(index) { 52 return errors.New("out of index range") 53 } 54 55 for i := this.length; i > index; i-- { 56 this.data[i] = this.data[i-1] 57 } 58 this.data[index] = v 59 this.length++ 60 return nil 61 } 62 63 func (this *Array) InsertToTail(v interface{}) error { 64 return this.Insert(this.Len(), v) 65 } 66 67 // 删除索引index上的值 68 func (this *Array) Delete(index uint) (interface{}, error) { 69 if index > this.Len() || this.isIndexOutOfRange(index) { 70 return nil, errors.New("out of index range") 71 } 72 ret := this.data[index] 73 for i := index; i < this.Len()-1; i++ { 74 this.data[i] = this.data[i+1] 75 } 76 this.length-- 77 return ret, nil 78 } 79 80 func (this *Array) String() string { 81 var sb strings.Builder 82 sb.WriteRune('[') 83 for i := uint(0); i < this.Len(); i++ { 84 sb.WriteString(fmt.Sprintf("%v", this.data[i])) 85 if i != this.Len()-1 { 86 sb.WriteRune(',') 87 } 88 } 89 sb.WriteRune(']') 90 return sb.String() 91 }