slice进阶

package main

import (
	"fmt"
	"reflect"
	"errors"
)

/*
使用append函数增加slice元素
slice可以实现栈

注意:
1.超过slice容量后,会为底层函数重新开辟更大内存空间
2.开辟新的内存空间,需手动更新slice的指针
 */
func main()  {
	//append
	myslice := make([]int, 1, 1)

	for i := 0 ; i < 10 ; i++ {
		//更新slice
		myslice = append(myslice, i + 1)
		fmt.Println(i,": 当前容量为", cap(myslice), myslice)
	}
	/*
	0 : 当前容量为 2 [0 1]
	1 : 当前容量为 4 [0 1 2]
	2 : 当前容量为 4 [0 1 2 3]
	3 : 当前容量为 8 [0 1 2 3 4]
	4 : 当前容量为 8 [0 1 2 3 4 5]
	5 : 当前容量为 8 [0 1 2 3 4 5 6]
	6 : 当前容量为 8 [0 1 2 3 4 5 6 7]
	7 : 当前容量为 16 [0 1 2 3 4 5 6 7 8]
	8 : 当前容量为 16 [0 1 2 3 4 5 6 7 8 9]
	9 : 当前容量为 16 [0 1 2 3 4 5 6 7 8 9 10]
	 */

	//rune实质为int32 byte实质为uint8
	myrunes := []rune("你好")
	mybytes := []byte("世界")
	fmt.Println(reflect.TypeOf(myrunes), reflect.TypeOf(mybytes))

	//stack
	mys := stackint{}
	//入栈
	for i := 0; i < 10 ; i++ {
		mys.stackPush(i)
	}
	mys.showMystack()
	//出栈
	for i := 0; i < 11 ; i++ {
		mys.stackPop()
	}
	mys.showMystack()
	//入栈
	for i := 0; i < 10 ; i++ {
		mys.stackPush(i)
	}
	mys.showMystack()
}

type stackint struct {
	s []int
}

//入栈
func (mystack *stackint)stackPush(x int)  {
	mystack.s = append(mystack.s, x)
}

//出栈
func (mystack *stackint)stackPop() (int,error) {
	if len(mystack.s) != 0 {
		tempint := mystack.s[len(mystack.s) - 1]
		mystack.s = mystack.s[:len(mystack.s) - 1]
		return tempint, nil
	} else {
		return 0, errors.New("栈为空")
	}
}

func (mystack *stackint)showMystack() {
	fmt.Println(mystack.s)
}

猜你喜欢

转载自www.cnblogs.com/zbhbc/p/9209585.html