函数 | 描述 |
---|---|
make | 创建具有指定元素类型、长度和容量的变量 |
len | 返回字符串的字节数(非文字符合的数目)、返回数组中的元素个数、返回slice长度 |
cap | 返回slice的容量 |
new | 创建变量 |
append | 将元素追加到slice后面 |
copy | 为两个拥有相同元素类型的slice复制元素 |
close | |
delete | 从map中删除一个元素 |
complex | 根据给定的实部和虚部创建复数 |
real | 提取复数的实部 |
imag | 提取复数的虚部 |
panic | 发生宕机,正常的程序执行终止,可以接受任何值作为参数 |
recover | 发生宕机,正常的程序执行终止,可以接受任何值作为参数。 |
make([]T,len)
make([]T,len,cap) // 和make([]T,cap)[:len]功能相等
make创建了一个无名数组并返回了它的一个slice,这个数组只能通过这个slice来访问。
使用内置函数new创建变量。表达式new(T)
创建一个未命名的T
类型变量,初始化为T
类型的零值,并返回其地址(地址类型为*T
)。
p := new(int) // *int 类型的p,指向未命名的int变量
fmt.Println(*p) // 输出 0
*p = 2 // 把未命名的int设置为2
fmt.Println(*p) // 输出 2
使用new
创建的变量和取其地址的普通局部变量没有什么不同。只是不需要引入和声明一个虚拟的名字,通过new(T)
直接在表达式中使用。
new
只是语法上的便利,不是一个基础概念。
func newInt() *int {
return new(int)
}
func newInt() *int {
var dump int
return &dump
}
// 这两个函数有相同的行为
每一次调用new
返回一个具有唯一地址的不同变量。
p := new(int)
q := new(int)
fmt.Println(p == q) // 输出 false
上述规则的例外情况:两个变量的类型不携带任何信息且是零值,例如
struct{}
或[0]int
,当前的实现中它们有相同的地址。
因为常见的未命名变量都是结构体类型,所以new
函数使用的相对较少。
new
是一个预声明的函数,不是一个关键字,可以被重定义为另外的其他类型。
将元素追加到slice后面。
var runes []rune
for _,r := range "Hello, 世界"{
runes = append(runes,r)
}
fmt.Printf("%q\n",runes) // "['H' 'e' 'l' 'l' 'o' ',' ' ' '世' '界']"
var x complex128 = complex(1,2) // 1+2i
// 简写
x := 1+2i
var y complex128 = complex(3,4) // 3+4i
fmt.Println(x*y) // "-5+10i"
fmt.Println(real(x*y)) // "-5"
fmt.Println(imag(x*y)) // "10"
源码中,如果在浮点数或十进制整数后紧跟字母i
,就变成一个虚数。