您的位置:首页 > 编程语言 > Go语言

go语言学习-未分类的一些记录

2016-07-15 00:00 399 查看

条件语句

for 平行赋值

用于前后互换

// 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

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")
}


单个case中,可以出现多个结果选项 case 1,2,3

与C语言等规则相反,Go语言不需要用break来明确退出一个case;

只有在case中明确添加fallthrough关键字,才会继续执行紧跟的下一个case;

可以不设定switch之后的条件表达式,在此种情况下,整个switch结构与多个if...else...的逻辑作用等同。

不定参数

形如...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{}) {}

init

所有init函数都在同一个goroutine内执行

所有init函数结束后才会执行main.main函数

defer

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

range 可以用来迭代数组,字符串,切片,映射和通道。

go GC

Go有GOGC变量,也可以通过runtime/debug包中的SetGCPercent函数来控制。

Go 调整 GC 参数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: