切片
尚硅谷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
此篇文章的評論功能已經停用。