func new

1
func new(Type) *Type

内建函数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

1
func cap(v Type) int

内建函数cap返回 v 的容量,这取决于具体类型:

1
2
3
4
数组:v中元素的数量,与 len(v) 相同
数组指针:*v中元素的数量,与len(v) 相同
切片:切片的容量(底层数组的长度);若 v为nil,cap(v) 即为零
信道:按照元素的单元,相应信道缓存的容量;若v为nil,cap(v)即为零

func len

1
func len(v Type) int

内建函数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关闭信道,该通道必须为双向的或只发送的。它应当只由发送者执行,而不应由接收者执行,其效果是在最后发送的值被接收后停止该通道。在最后的值从已关闭的信道中被接收后,任何对其的接收操作都会无阻塞的成功。对于已关闭的信道,语句:

1
x, ok := <-c

还会将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的实部。