变长参数 nums …int
格式化:
在命令行输入 gofmt –w program.go 会格式化该源文件的代码然后将格式化后的代码覆盖原始内容(如果不加参数 -w 则只会打印格式化后的结果而不重写文件);gofmt -w *.go 会格式化并重写所有 Go 源文件;gofmt map1 会格式化并重写 map1 目录及其子目录下的所有 Go 源文件。
格式化:gofmt 也可以通过在参数 -r 后面加入用单引号括起来的替换规则实现代码的简单重构,规则的格式:<原始内容> -> <替换内容> 例如 gofmt -r ‘(a) -> a’ -w .go, gofmt -r ‘a[n:len(a)] -> a[n:]’ –w .go,
c1 := make(chan int) 无缓存 放入第一个值就会发生阻塞。
c2 := make(chant int, 1) 有缓存,大小为1.放入第二个值才会阻塞。
一个双向通道可以直接赋值给一个单向通道
命名函数只能在包级别的作用域声明,在函数域声明一个函数需要使用函数字面量/匿名函数
select在多个通道上监听IO操作,即case后面只能是IO操作。如果某个case后面的通道发生了通信,它就有可能执行。如果有多个case可以执行,会随机选择一个执行,其他的不会执行。即所有的case子句都会得到判断,再进行选择。
在执行select语句的时候,运行时系统会自上而下地判断每个case中的发送或接收操作是否可以被立即执行(立即执行:意思是当前Goroutine不会因此操作而被阻塞)
结构体字面量 通过部分或全部指定成员和其对应的值,使用键值对的形式,以逗号分隔,最后一个也加逗号。
type abc struct {
a string
b int64
c bool
}
func main() {
a := abc{
a: "hello_world",
b: 100,
c: true,
}
fmt.Println(a) //输出结果{hello_world 100 true}
b := &a
fmt.Println(b) //输出结果 &{hello_world 100 true}
}
map字面量
m := map[string]int{
“alice”: 31,
}
数组字面量 a := [3]int{1, 2, 3} 或 a := […]int{1, 2, 3}
slice字面量 a := []int{1, 2, 3} 不指定长度
go追求简洁优雅,所以不支持传统的try…catch..finally这种处理异常的方式,因为这将导致一个小小的错误都抛出一个异常。在go中,使用多值来返回错误,不能使用异常来代替错误,更不能用来控制流程。在只有遇到真正异常的情况下,才使用go中的异常处理:defer/panic/recover
使用场景:抛出一个panic异常,在defer中通过recover捕获,然后处理。必须要先声明defer,在其中使用recover捕获异常。
panic时go中内置的函数,表示非常严重的不可恢复的错误。panic一般会导致程序挂掉,除非使用recover,然后打印出调用栈。
导入包,可以使用相对路径。只为了调用init,使用下划线
同一个包下的多个文件的init,按照文件名的字典顺序调用