切片
尚硅谷Golang課
func main() {
	//切片的類型是引用(傳遞的時候也是引用地址)
	//切片長度可變(不像數組)
	var arr1 = [5]int{1, 2, 3, 4, 5}
	s1 := arr1[1:3] //表示切arr的[1 2] 左開右閉(含左不含右)
	//var slice=arr[0:end]簡寫[:end]
	//[start:len(arr)]=[start:]
	//[0:len(arr)]=[:]
	fmt.Println("s1內容是", s1)
	fmt.Println("s1長度是", len(s1))
	fmt.Println("s1容量是", cap(s1))
	fmt.Printf("s1第一個地址是%p\n", &s1[0])
	fmt.Printf("arr1[1]地址是%p\n", &arr1[1])
	s1[0] = 33
	fmt.Println("arr1內容是", arr1)

	//var 切片名[]type=make([]type,len,cap)
	var s2 []float64 = make([]float64, 5, 10)
	fmt.Println(s2)
	//var 變量=make(類型)
	var s22 = make([]float64, 5, 10)
	fmt.Println(s22)
	var s3 []int = []int{1, 2, 3, 4, 5}
	fmt.Println(s3)
	//用append動態追加
	s3 = append(s3, 6, 7, 8, 9)
	fmt.Println(s3)
	s3 = append(s3, s3...) //...表示擴展
	//用append的時候 其實是創建一個新的arr,值拷貝過去,然後重新指向
	s3[10] = 600
	fmt.Println(s3)

	//用copy 要求2者都是切片類型
	//短的賦給長的 後面沒東西就保持原樣(0)
	//長的賦給短的 不會自動擴容 依照短的
	var s4 = make([]int, 20)
	fmt.Println(s4)
	copy(s4, s3)
	fmt.Println(s4)

}

切string

	str := "hello@yozimingfight!"
	//string是一個byte數組,所以可以切片擷取
	s1 := str[6:]
	fmt.Println(s1)
	//但是string是不可變的,不能用s1[0]='z'這樣想改變一個字
	//看做一個read only的切片

	//可以轉[]byte或[]rune 修改 後轉回去
	arr1 := []byte(str)
	arr1[0] = 'z'
	str = string(arr1)
	fmt.Println(str)
	//byte不能處理中文字(3字節)
	arr2 := []rune(str)
	arr2[0] = '我'
	str = string(arr2)
	fmt.Println(str)

切片練習-費波納數列

func fbn(n int) []uint64 {
	var s1 []uint64 = make([]uint64, n)
	if n < 2 {
		s1[0] = 1
		return s1
	} else {
		s1[0] = 1
		s1[1] = 1
		for i := 2; i < n; i++ {
			s1[i] = s1[i-1] + s1[i-2]
		}
		return s1
	}
}

func main() {
	a := fbn(1)
	fmt.Println(a)
}

上次修改於 2021-08-01

此篇文章的評論功能已經停用。