【golang】实现动态数组

前言

在go中,slice可以当作是一种动态数组,但是博主还是想借助slice手动实现一下。

代码

结构体

// array 切片结构体
type array struct {
	arr []int
	len int
	cap int
}

创建

func makeArr(len,cap int) *array{
	a := new(array)
	if len > cap {
		fmt.Println("invalid,len large than cap")
		return nil
	}
	arr := make([]int,len,cap)
	a.arr = arr
//  a.len = cap,会增加长度为cap的零值
//  a.len = 0   正常显示,前面不会增加零值
	a.len = 0
	a.cap = cap
	return a
}

切片扩容

// extension 切片扩容
func (a *array) extension() *array{
	var newCap int
	if a.cap <= 10{
		newCap = 3 * a.len
	}else{
		newCap = 2 * a.len
	}
// 新数组的长度为newCap
	newArr := make([]int,newCap,newCap)
// arr的长度应该也是newCap
	a.arr = newArr
	a.cap = newCap
	return a
}

获取容量

// getCap 获取容量
func (a *array) getCap() int{
	return  a.cap
}

获取长度

// getLen 获取长度
func  (a *array) getLen() int{
	return  a.len
}

添加一个元素

// 添加一个元素
func (a *array) append(element int){
//	首先判断容量
	if a.cap == a.len {
		newArr := a.extension()
//	   将旧值移动到新的数组中
		for i := 0; i < a.len; i++ {
			newArr.arr[i] = a.arr[i]
		}
//       将新数组赋值给原数组
		a.arr = newArr.arr
//       改变数组的map
		a.cap = newArr.cap
	}
	a.arr[a.len] = element
//     原数组长度+1
	a.len = a.len+1
}

添加多个元素

// appendMore 添加多个元素 可变参数在函数中化为切片类型
func (a *array) appendMore(element ...int){
	for _,v := range element{
		a.append(v)
	}
}

获取某个元素下标

func (a *array) getIndex(element int) int{
	if a.len == 0 {
		return -1
	}
	for k, v := range a.arr {
		if v == element {
			return k
		}
	}
	return -1
}

获取指定下标的元素

// getElemIndex 获取指定下标的元素
func (a *array) getElemIndex(index int) int{
	if index < 0 || index >= a.len {
		return -1
	}
	for k,v := range a.arr{
		if k == index{
			return v
		}
	}
	return -1
}

删除指定元素

// 删除指定元素
func (a *array) delElem(element int) int{
	index := a.getIndex(element)
//  如果删除的是最后一个元素,那么截取前一部分就行
	if index == a.len-1 {
		a.arr[index] = 0
	}
	for i := 0; i < a.len; i++ {
		if i >= index {
			a.arr[i] = a.arr[i+1]
		}
	}
	a.len = a.len-1
	return index
}

打印功能

// 打印功能
func (a *array) printElement() (res string){
	if a.len == 0 {
		res = "[]"
		return
	}
	res = "["
	for i := 0; i < a.len;i++{
//   第一个元素仅挨括号
		if i == 0 {
			res = fmt.Sprintf("%s%d",res,a.getElemIndex(i))
			continue
		}
		res = fmt.Sprintf("%s %d",res,a.getElemIndex(i))
	}
	res += "]"
	return
}

完结

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值