1.slice(切片)代表變長的序列,序列中每個元素都有相同的型別,乙個slice型別一般寫作t,其中t代表slice中元素的型別;slice的語法和陣列很像,只是沒有固定長度而已,slice的底層確實引用乙個陣列物件
2.內建的len和cap函式分別返回slice的長度和容量
3.s[i:j] , 從第i個元素開始到第j-1個元素的子串行,s[:]切片操作則是引用整個陣列
4.slice值包含指向第乙個slice元素的指標,因此向函式傳遞slice將允許在函式內部修改底層陣列的元素
5.將slice元素迴圈向左旋轉n個元素的方法是三次呼叫reverse反轉函式,第一次是反轉開頭的n個元素,然後是反轉剩下的元素,最後是反轉整個slice的元素。
6.slice之間不能比較,因此我們不能使用==操作符來判斷兩個slice是否含有全部相等元素,slice唯一合法的比較操作是和nil比較
7.可以用int(nil)型別轉換表示式來生成乙個對應型別slice的nil值
8.測試乙個slice是否是空的,使用len(s) == 0來判斷
9.make函式建立乙個指定元素型別、長度和容量的slice , make(t, len)
11.rune("hello, 世界") 字串轉rune型別的slice
14.報錯invalid indirect of s[j] (type int) ,使用陣列指標的時候(*s)[0]
15.slice記憶體技巧,
練習 4.3: 重寫reverse函式,使用陣列指標代替slice。
練習 4.4: 編寫乙個rotate函式,通過一次迴圈完成旋轉。
練習 4.5: 寫乙個函式在原地完成消除string中相鄰重複的字串的操作。
練習 4.7: 修改reverse函式用於原地反轉utf-8編碼的byte。是否可以不用分配額外的記憶體?
package mainimport(
"fmt"
"unicode"
)func main()
//reverse(&testarr)
fmt.println(testarr)
a:=rotate(testarr[:],2)
fmt.println(a)
b:=string
emptystring(b)
d:=byte("abc bcd wer sdsd taoshihan de")
e:=emptystring2(d)
fmt.println(string(e))
f:=byte("abc bcd wer sdsd taoshihan de")
reverse1(f)
fmt.println(string(f))}/*
練習 4.3: 重寫reverse函式,使用陣列指標代替slice。
*/func reverse(s *[5]int)
res[i] = s[index]
}
return res }/*
練習 4.5:寫乙個函式在原地完成消除string中相鄰重複的字串的操作。
*/func emptystring(s string)string
if v != s[index]
}fmt.println(s[:i])
return s[:i]}/*
*/func emptystring2(s byte)byte
if unicode.isspace(rune(s[i])) && unicode.isspace(rune(s[index]))
}return s}/*
練習 4.7: 修改reverse函式用於原地反轉utf-8編碼的byte。是否可以不用分配額外的記憶體?
*/func reverse1(s byte)
}
Go語言切片 Slice
python裡面切片是一種操作,用於取list裡面元素。而go語言的切片則是一種資料型別,而不是一種操作。go語言中提供了切片 slice 作為一種更為靈活 功能強悍的內建型別,它其實是陣列的一種抽象。切片的原始碼 type slice struct slice是原陣列在記憶體中的位址的乙個指標,它...
Go語言核心 slice切片
slice是長度可變的元素序列 陣列不可變 每個元素都有相同的型別。slice型別寫作t,其中t代表slice中的元素型別 slice和陣列寫法很像,只是沒有指定長度。陣列和slice之間的聯絡非常緊密。slice是非常輕量的資料結構,它是引用型別,指向底層的乙個陣列,該陣列被稱之為slice的底層...
go語言基礎 切片 slice
理解為變長的陣列 a 切片建立 s1 int s2 make t,len,cap arr 5 int s3 arr start end 切割陣列 start,end s4 arr b 切片的型別 資料型別 切片屬於引用型別 s1 int s2 s1 packagemain import fmt fu...