package main
import "fmt"
// 定义结构体声明数组中有哪些元素
type Array struct {
Data []interface{} // 泛型数组,支持多种数据类型 String,Int,Array
Size int // 数组中的长度
}
// 创建构造函数,初始化数值
func (a *Array) construct(capaCity int) {
a.Data = make([]interface{}, capaCity) // 创建数组,自定容量
a.Size = 0 // 数组的长度
}
// 获取数组中的长度
func (a *Array) len() int {
return a.Size
}
// 获取数组容量
func (a *Array) capaCity() int {
return len(a.Data)
}
// 判断数组是否为空
func (a *Array) is_empty() bool {
return a.Size == 0
}
// 添加尾部元素
func (a *Array) add_last(val interface{}) {
a.add(a.Size, val)
}
// 添加头部元素
func (a *Array) add_fast(val interface{}) {
a.add(0, val)
}
// 添加指定元素
func (a *Array) add(index int, val interface{}) {
if index < 0 || index > a.capaCity() {
fmt.Print("添加失败2")
return
}
if a.Size == a.capaCity() {
a.resize(a.capaCity() * 2) // 扩容多少,根据当前数组已存在的数据长度2倍(或3倍)
}
// 如 数组[1, 2, 3, 4], index = 2,那么a.Size = 5,此时 a.Size-1 需要 -1 定位 i 位置
for i:=a.Size-1; i>=index; i-- {
a.Data[i+1] = a.Data[i]
}
a.Data[index] = val
a.Size ++
}
// 判断元素是否存在数组中
func (a *Array) in_array(val int) bool {
for i:=0; i<a.Size; i++ { // 循环数组中每一个元素,进行比较
if a.Data[i] == val {
return true
}
}
return false
}
// 删除元素
func (a *Array) del(index int) interface{} {
if index < 0 || index >= a.Size {
return -1
}
val := a.Data[index] // 存储需要删除的值,并返回
// 如 数组[5, 9, 2, 8],index = 2 。那么 index=3,size=4,值2,8的键值-1
for i:=index+1; i<a.Size; i++ {
a.Data[i-1] = a.Data[i]
}
a.Size --
a.Data[a.Size] = nil // // 最后一个退回的值设置为nil
// 缩容
if a.Size == a.capaCity() / 4 && a.Size != 1 {
a.resize(a.capaCity() / 2)
}
return val
}
// 删除第一个元素
func (a *Array) del_fast() interface{} {
return a.del(0)
}
// 删除最后一个元素
func (a *Array) del_last() interface{} {
return a.del(a.Size-1)
}
// 变更容量
func (a *Array) resize(capacity int) {
arr := make([]interface{}, capacity) // 创建数组,自定容量
for i:=0; i<a.Size; i++ {
arr[i] = a.Data[i]
}
a.Data = arr
}
// 打印数组
func (a *Array) print() {
fmt.Print(a.Data, "\n")
}
func main () {
var arr Array
arr.construct(3) // 设置动态数组,需开辟空间
arr.add(0, 99) // 添加
arr.add_last(66)
arr.add_last(77)
arr.del(1) // 删除
arr.print()
}
原文:https://www.cnblogs.com/linsonga/p/14821818.html