1.切片跟数组操作的一些方式比较类似,最基本的区分就是 数组是定长 而 切片可以不定长

2.切片也是引用类型

切片使用的三种方式 

方式一:

package main

import(
	"fmt"
)

func main(){
	intArr := [...]int{11,22,33,44,55}
	/*
	 slice:切片名称
	 intArr[1:3] :表示 slice 引用到intArr这个数组
	 引用数组 1:起始下标 3:截止下标(但不包括3)
	*/
	slice := intArr[1:3]
	fmt.Println("intArr =",intArr)
	fmt.Println("slice 的元素个数是=",len(slice))
	fmt.Println("slice 的容量是=",cap(slice))
	/*
	结果
	intArr = [11 22 33 44 55]
	slice 的元素个数是= 2
	slice 的容量是= 4    
	*/
	//修改切片的0下标 那么数组的1下标也会发生变化,因为是引用关系
	slice[0] = 1
	fmt.Println(intArr)
	fmt.Println(slice)
	/*
	结果
	intArr = [11 22 33 44 55]
	slice 的元素个数是= 2
	slice 的容量是= 4
	[11 1 33 44 55]
	[1 33]
	*/

}

方式二,三

package main

import(
	"fmt"
)

func main(){
	//方式二
	//演示切片的使用
	//make 声明切片 参数1:类型 参数2:长度 参数3:容量
	var slice []int = make([]int,5,10)
	slice[0] = 10
	slice[4] = 33
	fmt.Println(slice) 
	fmt.Println("slice 的长度=",len(slice))
	fmt.Println("slice 的容量=",cap(slice))
	/*
	[10 0 0 0 33]
	slice 的长度= 5 
	slice 的容量= 10
	*/



	//方式三
	//var strSlice []string = []string{"tom","make","jom"}
	strSlice := []string{"tom","make","jom"}
	fmt.Println(strSlice) 
	fmt.Println("strSlice 的长度=",len(strSlice))
	fmt.Println("strSlice 的容量=",cap(strSlice))
	/*
	结果:
	[tom make jom]
	strSlice 的长度= 3
	strSlice 的容量= 3
	*/

}

切片的遍历基础操作

package main
import(
	"fmt"
)

func main(){

	var arrInt [5]int = [5]int{10,20,30,40,50}
	var slice []int = arrInt[1:4]

	//for 循环
	for i := 0; i < len(slice); i++{
		fmt.Printf("slice[%v]=%v ",i,slice[i])
	}
	//结果:slice[0]=20 slice[1]=30 slice[2]=40 

	fmt.Println()

	//for range循环
	for index,value := range slice{
		fmt.Printf("index = %v value = %v\n",index,value)
	}
	/*
	index = 0 value = 20
	index = 1 value = 30
	index = 2 value = 40
	*/


	//用append内置函数,可以对切片进行动态追加
	var slice3 []int = []int{100,200,300}
	slice3 = append(slice3,400,500,600)
	fmt.Println("slice3",slice3)
	//结果slice3 [100 200 300 400 500 600]   

	//也可以用切片进行追加,必须也是切片
	slice3 = append(slice3,slice3...)//...必须要的
	fmt.Println("slice3",slice3)
	//结果slice3 [100 200 300 400 500 600 100 200 300 400 500 600]


	//copy 拷贝内置函数 *必须都是切片类型才可以进行拷贝
	var a []int = []int{1,2,3,4,5}

	var slice4 = make([]int,10)
	fmt.Println("slice4 = ",slice4)
	//结果slice4 =  [0 0 0 0 0 0 0 0 0 0]
	copy(slice4,a)
	fmt.Println("slice4 = ",slice4)
	//结果slice4 =  [1 2 3 4 5 0 0 0 0 0]
}

 修改string 先转成[]byte 或 []rune -》修改 -》重新在转成string 

package main
import(
	"fmt"
)

func main(){
	str := "hello@atesadas"
	//获取a后面的字符串
	slice1 := str[6:]
	fmt.Printf("slice1 = %v slice1 的类型 = %T\n",slice1,slice1)
	//结果slice1 = atesadas slice1 的类型 = string

	//把hello@atesadas 改成 zello@atesadas
	//先转成[]byte 或 []rune -》修改 -》重新在转成string
	arr1 := []byte(str)
	arr1[0] = 'z'
	str = string(arr1)
	fmt.Printf("str = %v str 的类型 = %T\n",str,str)
	//结果str = zello@atesadas str 的类型 = string


	//上面的只能修改 英文是数字 ,byte是根据字节来处理 而一个中文就占3个字符 所以会乱码
	//解决方式把byte 改成rune rune可以兼容中文

	arr2 := []rune(str)
	arr2[0] = '天'
	str = string(arr2)
	fmt.Printf("str = %v str 的类型 = %T",str,str)
	//结果str = 天ello@atesadas str 的类型 = string
}

斐波那契数 

package main

import(
	"fmt"
)

// 斐波那契数  uint64 长度未知所以放一个最大接收类型
func test(n int) ([]uint64){
  slice := make([]uint64,n)
  slice[0] = 1
  slice[1] = 1
  //前俩个数都为1 从下标为2的开始
  for i := 2; i < n; i++{
	//下标为2的数 是 前一个数和前二个数相加   
	slice[i] = slice[i - 1] + slice[i - 2] 
  }
  return slice
}
func main(){
   slice := test(10)
   fmt.Println(slice)
   //结果[1 1 2 3 5 8 13 21 34 55]
}