共计 2002 个字符,预计需要花费 6 分钟才能阅读完成。
new()和 make 的区别
二者看起来没什么区别,然而他们的行为不同,别离实用于不同的类型
- new (T) 为每个新的类型 T 调配一片内存,初始化为 0 并且返回类型为 * T 的内存地址:这种办法 返回一个指向类型为 T,值为 0 的地址的指针,它实用于值类型如数组和构造体;它相当于 &T{}。
- make(T) 返回一个类型为 T 的初始值,它只实用于 3 种内建的援用类型:切片、map 和 channel
bytes 包
类型 []byte
的切片非常常见,Go 语言有一个 bytes 包专门用来解决这种类型的操作方法,比方 bytes 的 buffer,就提供 Read 和 Write 的办法,读写未知长度的 bytes 时候最好用 buffer,上面的例子相似于 Java 的 StringBuilder 的 append 办法
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")
slice 重组
晓得切片创立的时候通常比相干数组小,例如:
slice1 := make([]type, start_length, capacity)
其中 start_length 作为切片初始长度而 capacity 作为相干数组的长度。
这么做的益处是咱们的切片在达到容量下限后能够扩容。扭转切片长度的过程称之为切片重组 reslicing,做法如下:slice1 = slice1[0:end],其中 end 是新的开端索引(即长度), 如果想减少切片的容量,咱们必须创立一个新的更大的切片并把原分片的内容都拷贝过去
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
}
Slice 的相干利用
假如 s 是一个字符串(实质上是一个字节数组),那么就能够间接通过 c := []byte(s)
来获取一个字节的切片 c。另外还能够通过 copy 函数来达到雷同的目标:copy(dst []byte, src string)
,应用 substr := str[start:end]
能够从字符串 str 获取到从索引 start 开始到 end-1
地位的子字符串
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]
-
批改字符串
- Go 语言中的字符串是不可变的,也就是说
str[index]
这样的表达式是不能够被放在等号左侧的,如果必须要批改,必须要先将字符串转为字节数组,而后通过批改元素值来达到批改字符串的目标,最初要讲字节数组转回字符串格局
- Go 语言中的字符串是不可变的,也就是说
-
字符串比照函数
Compare
函数会返回两个字节数组字典程序的整数比照后果
-
搜寻及排序切片和数组
- 规范库提供了
sort
包来实现常见的搜寻和排序操作。您能够应用sort
包中的函数func Ints(a []int)
来实现对 int 类型的切片排序
- 规范库提供了
-
切片和垃圾回收
切片的底层指向一个数组,该数组的理论容量可能要大于切片所定义的容量。只有在没有任何切片指向的时候,底层的数组内存才会被开释,这种个性有时会导致程序占用多余的内存
吴邪,小三爷,混迹于后盾,大数据,人工智能畛域的小菜鸟。
更多请关注