数组的结构定义,如下:
type Array struct {
data []int
len uint
}实现的操作:
- 返回数组长度
- 根据数组索引查找值
- 根据索引插入值
- 删除对应索引的值
- 打印数组
代码如下:
package main
import (
"errors"
"fmt"
)
type Array struct {
data []int
len uint
}
// 为数组初始化内存
func NewArray(capacity uint) *Array {
if capacity == 0 {
return nil
}
return &Array{
data: make([]int, capacity, capacity),
len: 0,
}
}
// 返回数组长度
func (this *Array) Len() uint {
return this.len
}
// 判断数组是否越界
func (this *Array) isIndexOutOfRange(idx uint) bool {
if idx >= uint(cap(this.data)) {
return true
}
return false
}
// 通过索引访问数组元素
func (this *Array) Find(idx uint) (int, error) {
if this.isIndexOutOfRange(idx) {
return 0, errors.New("Out of index range!")
}
return this.data[idx], nil
}
// 插入数值到索引idx上
func (this *Array) Insert(idx uint, v int) error {
// 数组已满
if this.Len() == uint(cap(this.data)) {
return errors.New("Full array!")
}
// 索引越界
if idx != this.Len() && this.isIndexOutOfRange(idx) {
return errors.New("Out of index range!")
}
// 将idx开始的元素全部向尾部移动一个单位
for i := this.Len(); i > idx; i-- {
this.data[i] = this.data[i-1]
}
// 插入到idx位置上
this.data[idx] = v
this.len++
return nil
}
// 插入到数组末尾
func (this *Array) InsertToTail(v int) error {
return this.Insert(this.Len(), v)
}
// 删除指定索引的元素,并返回其值
func (this *Array) Delete(idx uint) (int, error) {
if this.isIndexOutOfRange(idx) {
return 0, errors.New("Out of index range!")
}
v := this.data[idx]
// 将idx后的元素向前移动一个单位, 删除idx上的元素
for i := idx; i < this.Len()-1; i ++ {
this.data[i] = this.data[i+1]
}
this.len--
return v, nil
}
// 打印数组的元素
func (this *Array) Print() {
var format string
for i := uint(0); i < this.Len(); i++ {
format += fmt.Sprintf("|%+v", this.data[i])
}
fmt.Println(format)
}
func main() {
arr:= NewArray(10)
for i:=0; i<10; i++ {
_ = arr.Insert(uint(i), i * i)
}
arr.Print()
arr.Delete(1)
arr.Print()
arr.Delete(2)
arr.Print()
_ = arr.Insert(5, 10)
arr.Print()
val, _ := arr.Find(1)
fmt.Println(val)
}

京公网安备 11010502036488号