预声明函数

函数描述
make创建具有指定元素类型、长度和容量的变量
len返回字符串的字节数(非文字符合的数目)、返回数组中的元素个数、返回slice长度
cap返回slice的容量
new创建变量
append将元素追加到slice后面
copy为两个拥有相同元素类型的slice复制元素
close
delete从map中删除一个元素
complex根据给定的实部和虚部创建复数
real提取复数的实部
imag提取复数的虚部
panic发生宕机,正常的程序执行终止,可以接受任何值作为参数
recover发生宕机,正常的程序执行终止,可以接受任何值作为参数。

make

make([]T,len)
make([]T,len,cap)   // 和make([]T,cap)[:len]功能相等

make创建了一个无名数组并返回了它的一个slice,这个数组只能通过这个slice来访问。

  • 上面的第一行代码中,返回的slice引用整个数组
  • 上面的第二行代码中,返回的slice引用数组的前len个元素,但它的容量是数组的长度,这为后面的slice元素留出空间

new

使用内置函数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是一个预声明的函数,不是一个关键字,可以被重定义为另外的其他类型。

append

将元素追加到slice后面。

var runes []rune

for _,r := range "Hello, 世界"{
    runes = append(runes,r)
}

fmt.Printf("%q\n",runes)    // "['H' 'e' 'l' 'l' 'o' ',' ' ' '世' '界']"

complex/real/imag

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,就变成一个虚数。

上次修改: 29 April 2020