前言
在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
// = cap,会增加长度为cap的零值
// = 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
}
完结