func new
内建函数new分配内存。其第一个实参为类型,而非值。其返回值为指向该类型的新分配的零值的指针。
在调用new函数时,将类型名作为参数即可创建出这个类型的指针型对象。
在golang中存在几种特殊的情况。如使用new创建chan类型指针型对象,但是仍然需要调用make来给chan类型变量分配容量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package main
import (
"fmt"
"time"
)
func main() {
// 创建通道类型指针型对象
var ch = new(chan int)
// 给对象分配容量,容量为1
*ch = make(chan int)
// 开启协程,从通道中读取数据
go func() {
fmt.Println(<-(*ch))
}()
// 向通道中写入数据
*ch <- 8
time.Sleep(time.Second * 1)
}
|
func make
1
|
func make(t Type, size ...IntegerType) Type
|
内建函数make分配并初始化一个类型为切片、映射、或通道的对象。其第一个实参为类型,而非值。make的返回类型与其参数相同,而非指向它的指针。其具体结果取决于具体的类型:
1
2
3
4
5
|
切片:size指定了其长度。该切片的容量等于其长度。切片支持第二个整数实参可用来指定不同的容量;
它必须不小于其长度,因此 make([]int, 0, 10) 会分配一个长度为0,容量为10的切片。
映射:初始分配的创建取决于size,但产生的映射长度为0。size可以省略,这种情况下就会分配一个
小的起始大小。
通道:通道的缓存根据指定的缓存容量初始化。若 size为零或被省略,该信道即为无缓存的。
|
func cap
内建函数cap返回 v 的容量,这取决于具体类型:
1
2
3
4
|
数组:v中元素的数量,与 len(v) 相同
数组指针:*v中元素的数量,与len(v) 相同
切片:切片的容量(底层数组的长度);若 v为nil,cap(v) 即为零
信道:按照元素的单元,相应信道缓存的容量;若v为nil,cap(v)即为零
|
func len
内建函数len返回 v 的长度,这取决于具体类型:
1
2
3
4
5
|
数组:v中元素的数量
数组指针:*v中元素的数量(v为nil时panic)
切片、映射:v中元素的数量;若v为nil,len(v)即为零
字符串:v中字节的数量
通道:通道缓存中队列(未读取)元素的数量;若v为 nil,len(v)即为零
|
对于string类型变量,它们每一个字节是一个长度。对于rune类型切片变量,它们每一个字符是一个长度,rune类型变量中的内容采用utf-8编码,一个字符可能对应4个字节。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
package main
import (
"fmt"
)
func main() {
// 数组
var arr [4]string = [4]string{"a", "b", "c", "d"}
fmt.Println("数组长度是:", len(arr))
// 切片
var slice []int = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
fmt.Println("slice长度是:", len(slice))
// 通道
var ch = make(chan int, 10)
ch <- 1
ch <- 2
ch <- 3
ch <- 4
fmt.Println("chan长度是:", len(ch))
// 字典
var mp map[string]bool = map[string]bool{
"0": false,
"1": true,
}
fmt.Println("map长度是:", len(mp))
// 字符串
var str string = "道德经"
fmt.Println("string类型长度是:", len(str))
fmt.Println("rune类型长度是:", len([]rune(str)))
}
|
1
2
3
4
5
6
|
数组长度是: 4
slice长度是: 10
chan长度是: 4
map长度是: 2
string类型长度是: 9
rune类型长度是: 3
|
len计算的不是这个变量的容量,而是计算这个变量已有数据的内容长度。上边的chan类型变量分配了10个buffer,但是len计算的长度只有4,刚好等于通道中现有数据元素个数。
func close
1
|
func close(c chan<- Type)
|
内建函数close关闭信道,该通道必须为双向的或只发送的。它应当只由发送者执行,而不应由接收者执行,其效果是在最后发送的值被接收后停止该通道。在最后的值从已关闭的信道中被接收后,任何对其的接收操作都会无阻塞的成功。对于已关闭的信道,语句:
还会将ok置为false。
func append
1
|
func append(slice []Type, elems ...Type) []Type
|
内建函数append将元素追加到切片的末尾。若它有足够的容量,其目标就会重新切片以容纳新的元素。否则,就会分配一个新的基本数组。append返回更新后的切片,因此必须存储追加后的结果。
1
2
|
slice = append(slice, elem1, elem2)
slice = append(slice, anotherSlice...)
|
As a special case, it is legal to append a string to a byte slice, like this:
1
|
slice = append([]byte("hello "), "world"...)
|
func copy
1
|
func copy(dst, src []Type) int
|
内建函数copy将元素从来源切片复制到目标切片中,也能将字节从字符串复制到字节切片中。copy返回被复制的元素数量,它会是 len(src) 和 len(dst) 中较小的那个。来源和目标的底层内存可以重叠。copy在进行切片内容拷贝时,并不会为目标切片扩展长度,所以,想要使用copy来复制切片内容,最好是给目标切片设置足够的长度来装载源切片中的内容。
func delete
1
|
func delete(m map[Type]Type1, key Type)
|
内建函数delete按照指定的键将元素从映射中删除。若m为nil或无此元素,delete不进行操作。
func panic
1
|
func panic(v interface{})
|
内建函数panic停止当前Go程的正常执行。当函数F调用panic时,F的正常执行就会立刻停止。F中defer的所有函数先入后出执行后,F返回给其调用者G。G如同F一样行动,层层返回,直到该Go程中所有函数都按相反的顺序停止执行。之后,程序被终止,而错误情况会被报告,包括引发该恐慌的实参值,此终止序列称为恐慌过程。
func recover
1
|
func recover() interface{}
|
内建函数recover允许程序管理恐慌过程中的Go程。在defer的函数中,执行recover调用会取回传至panic调用的错误值,恢复正常执行,停止恐慌过程。若recover在defer的函数之外被调用,它将不会停止恐慌过程序列。在此情况下,或当该Go程不在恐慌过程中时,或提供给panic的实参为nil时,recover就会返回nil。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package main
import "fmt"
func demo() {
panic("抛出异常")
}
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println(r)
}
}()
demo()
}
|
当没有异常信息抛出时,recover函数返回值是nil。recover只有在defer调用的函数内部时,才能阻止panic抛出的异常信息继续向上传递,如果不是在defer调用的函数内部,将会是什么样子呢?
1
2
3
4
5
6
|
package main
func main() {
defer recover()
panic("hello world")
}
|
输出信息是:
1
2
3
4
5
|
panic: hello world
goroutine 1 [running]:
main.main()
...go实战/src/github.com/hzwy23/GoDemos/demo11/main.go:5 +0x66
|
所以必须将recover函数调用放在defer调用的函数内部,如:
1
2
3
4
5
6
7
8
|
package main
func main() {
defer func() {
recover()
}()
panic("hello world")
}
|
这样才能阻止panic抛出的异常信息继续向上传递。
func print
1
|
func print(args ...Type)
|
内建函数print以特有的方法格式化参数并将结果写入标准错误,用于自举和调试。
func println
1
|
func println(args ...Type)
|
println类似print,但会在参数输出之间添加空格,输出结束后换行。
func complex
1
|
func complex(r, i FloatType) ComplexType
|
complex函数从两个浮点值构造一个复数。实部和虚部的大小必须相同,float32或float64(或可分配给它们),返回值将是相应的复数类型(float32的complex64,float64的complex128)。
func imag
1
|
func imag(c ComplexType) FloatType
|
返回复数c的虚部。
func real
1
|
func real(c ComplexType) FloatType
|
返回复数c的实部。