Open
Description
-
array
之间的赋值是值的赋值。即当把一个数组作为参数传入一个函数时,传入的是值的拷贝,而不是指针。如果要使用指针,需要使用slice
类型。 -
Go语言中
slice
,map
,channel
这三种类型的实现机制类似指针,所以可以直接传递地址,而不用先取地址后传递。(若函数需要改变slice
的长度,仍需要取地址传递指针) -
new(T)
分配零值填充的T
类型的内存空间,并返回其地址(*T
类型的值)。new
返回指针 -
make(T, args)
只能创建slice
,map
,channel
,并且返回一个具有初始值的T
类型,而不是*T
。导致这三个类型有所不同的原因是指向数据结构的引用在使用前必须被初始化。例如,一个slice
,是一个包含指向数据(内部array)的指针、长度和容量的三项描述符;在这些项目被初始化之前,slice为nil
。对于slice
、map
和channel
来说,make
初始化了内部的数据结构,填充适当的值。make
返回初始化后的非零值 -
当函数中有多个
defer
语句,这些defer
语句会按照逆序执行。 -
函数作为值、类型
package main
import "fmt"
type testInt func (int) bool //声明了一个函数类型
func isOdd (i int) bool {
if i % 2 == 0 {
return false
}
return true
}
func isEven (i int) bool {
if i % 2 == 0 {
return true
}
return false
}
func filter (list []int, f testInt) []int {
var result []int
for _, v := range list {
if f(v) {
append(result,v)
}
}
return result
}
func main () {
list := []int{1,2,3,4,5,6,7,8}
odd := filter(list, isOdd)
even := filter(list, isEven)
fmt.Println("Odd elements: ", odd)
fmt.Println("Even elements: ", even)
}
interface
类型定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口。任意的类型都实现了空interface
。空interface
可以存储任意类型的值
// 定义a为空接口
var a interface{}
var i int = 5
s := "hello"
// a可以存储任意类型的数值
a = i
a = s
-
channel
默认为非缓存类型。Go也允许指定channel的缓存大小,就是channel可以存储多少元素。ch:= make(chan bool, 4)
,创建了可以存储4个元素的bool
型channel。在这个channel 中,前4个元素可以无阻塞的写入。当写入第5个元素时,代码将会阻塞,直到其他goroutine从channel 中读取一些元素,腾出空间。 -
可以使用
range
像操作slice
和map
类型一样操作缓存类型channel