两者看起来没什么区别,可是他们的行为不一样,分别适用于不一样的类型数组
类型 []byte
的切片十分常见,Go 语言有一个 bytes 包专门用来解决这种类型的操做方法,好比bytes的buffer,就提供Read和Write的方法,读写未知长度的bytes时候最好用buffer,下面的例子相似于Java的StringBuilder的append方法app
var buffer bytes.Buffer for { if s, ok := getNextString(); ok { //method getNextString() not shown here buffer.WriteString(s) } else { break } } fmt.Print(buffer.String(), "\n")
知道切片建立的时候一般比相关数组小,例如:函数
slice1 := make([]type, start_length, capacity)
其中 start_length 做为切片初始长度而 capacity 做为相关数组的长度。大数据
这么作的好处是咱们的切片在达到容量上限后能够扩容。改变切片长度的过程称之为切片重组 reslicing,作法以下:slice1 = slice1[0:end],其中 end 是新的末尾索引(即长度),若是想增长切片的容量,咱们必须建立一个新的更大的切片并把原分片的内容都拷贝过来ui
package main import "fmt" func main() { sl_from := []int{1, 2, 3} sl_to := make([]int, 10) n := copy(sl_to, sl_from) fmt.Println(sl_to) fmt.Printf("Copied %d elements\n", n) // n == 3 sl3 := []int{1, 2, 3} sl3 = append(sl3, 4, 5, 6) fmt.Println(sl3) }
注意: append 在大多数状况下很好用,可是若是你想彻底掌控整个追加过程,你能够实现一个这样的 AppendByte 方法:人工智能
func AppendByte(slice []byte, data ...byte) []byte { m := len(slice) n := m + len(data) if n > cap(slice) { // if necessary, reallocate // allocate double what's needed, for future growth. newSlice := make([]byte, (n+1)*2) copy(newSlice, slice) slice = newSlice } slice = slice[0:n] copy(slice[m:n], data) return slice }
假设 s 是一个字符串(本质上是一个字节数组),那么就能够直接经过 c := []byte(s)
来获取一个字节的切片 c。另外还能够经过 copy 函数来达到相同的目的:copy(dst []byte, src string)
,使用 substr := str[start:end]
能够从字符串 str 获取到从索引 start 开始到 end-1
位置的子字符串spa
package main import "fmt" func main() { s := "\u00ff\u754c" for i, c := range s { fmt.Printf("%d:%c ", i, c) } }
在内存中,一个字符串其实是一个双字结构,即一个指向实际数据的指针和记录字符串长度的整数(见图 7.4)。由于指针对用户来讲是彻底不可见,所以咱们能够依旧把字符串看作是一个值类型,也就是一个字符数组。指针
字符串 string s = "hello" 和子字符串 t = s[2:3]code
修改字符串排序
str[index]
这样的表达式是不能够被放在等号左侧的,若是必需要修改,必需要先将字符串转为字节数组,而后经过修改元素值来达到修改字符串的目的,最后要讲字节数组转回字符串格式字符串对比函数
Compare
函数会返回两个字节数组字典顺序的整数对比结果搜索及排序切片和数组
sort
包来实现常见的搜索和排序操做。您可使用 sort
包中的函数 func Ints(a []int)
来实现对 int 类型的切片排序切片和垃圾回收
切片的底层指向一个数组,该数组的实际容量可能要大于切片所定义的容量。只有在没有任何切片指向的时候,底层的数组内存才会被释放,这种特性有时会致使程序占用多余的内存
吴邪,小三爷,混迹于后台,大数据,人工智能领域的小菜鸟。
更多请关注