用于前后互换
// Reverse a
for i, j := 0, len(a)-1; i < j; i, j = i+1, j-1 {
a[i], a[j] = a[j], a[i] ← 这里也是
}
swich 条件语句并不是必须的可以
//将条件判断放入case中
switch {
case 0 <= Num && Num <= 3:
fmt.Printf("0-3")
case 4 <= Num && Num <= 6:
fmt.Printf("4-6")
case 7 <= Num && Num <= 9:
fmt.Printf("7-9")
case 10,11,12:
fmt.Println("10-12")
}
形如...type格式的类型只能作为函数的参数类型存在,并且必须是最后一个参数。
它是一个语法糖(syntactic sugar),即这种语法对语言的功能并没有影响,但是更方便程序员使用。通 常来说,使用语法糖能够增加程序的可读性,从而减少程序出错的机会。
从内部实现机理上来说,类型...type本质上是一个数组切片,也就是[]type,
但从调用方来说,情形则完全不同:
myfunc2([]int{1, 3, 7, 13}) //[]type
myfunc(1, 3, 7, 13) //...type
//传递
myfunc3(args...) // 按原样传递
myfunc3(args[1:]...) // 传递片段,实际上任意的int slice都可以传进去
//使用interface{} 传递任意参数
func Printf(format string, args ...interface{}) {}
defer语句的调用是遵照先进后出的原则,即最后一个defer语句将最先被执行。只不过,当你需要为defer语句到底哪 个先执行这种细节而烦恼的时候,说明你的代码架构可能需要调整一下了。
//可以使用匿名函数进行整体清理
defer func() {
// 做你复杂的清理工作
} ()
golang的defer精析
defer是在return之前执行的
defer确实是在return之前调用的。但表现形式上却可能不像。本质原因是return xxx语句并不是一条原子指令,defer被插入到了赋值 与 RET之前,因此可能有机会改变最终的返回值。
在代码中使用形如下列这样的代码可以确保接口一定被实现,不然会报错
type Handler interface {
ServeMsg(*Context)
}
var _ Handler = HandlerFunc(nil) // 确保实现接口
type HandlerFunc func(*Context)
func (fn HandlerFunc) ServeMsg(ctx *Context) {
fn(ctx)
}
每个包都应该有包注释,在package 前的一个注释块。对于多个文件的包,包注释只要出现在任意一个文件前都可以,go doc 生成时就可以显示。
range 可以用来迭代数组,字符串,切片,映射和通道。
Go有GOGC变量,也可以通过runtime/debug包中的SetGCPercent函数来控制。