数组的结构定义,如下:

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)
}