for 循环支持 continue 和 break 来控制循环,但是它提供了一个更高级的break,可以选择中断哪一个循环 for 循环不支持以逗号为间隔的多个赋值语句,必须使用平行赋值的方式来初始化多个变量。
2.Array 类型的值作为函数参数
在 C/C++ 中,数组(名)是指针。将数组作为参数传进函数时,相当于传递了数组内存地址的引用,在函数内部会改变该数组的值。
在 Go 中,数组是值。作为参数传进函数时,传递的是数组的原始值拷贝,此时在函数内部是无法更新该数组的。
在 C/C++ 中,数组(名)是指针。将数组作为参数传进函数时,相当于传递了数组内存地址的引用,在函数内部会改变该数组的值。
在 Go 中,数组是值。作为参数传进函数时,传递的是数组的原始值拷贝,此时在函数内部是无法更新该数组的。
// 数组使用值拷贝传参
func main() {
x := [3]int{1,2,3}
func(arr [3]int) {
arr[0] = 7
fmt.Println(arr) // [7 2 3]
}(x)
fmt.Println(x) // [1 2 3] // 并不是你以为的 [7 2 3]
}
想改变数组,直接传递指向这个数组的指针类型。
// 传址会修改原数据
func main() {
x := [3]int{1,2,3}
func(arr *[3]int) {
(*arr)[0] = 7
fmt.Println(arr) // &[7 2 3]
}(&x)
fmt.Println(x) // [7 2 3]
}
直接使用 slice:即使函数内部得到的是 slice 的值拷贝,但依旧会更新 slice 的原始数据(底层 array)
// 错误示例
func main() {
x := []string{"a", "b", "c"}
for v := range x {
fmt.Println(v) // 1 2 3
}
}
// 正确示例
func main() {
x := []string{"a", "b", "c"}
for _, v := range x { // 使用 _ 丢弃索引
fmt.Println(v)
}
}
单个 case 中,可以出现多个结果选项。只有在 case 中明确添加 fallthrough关键字,才会继续执行紧跟的下一个 case。
方法施加的对象显式传递,没有被隐藏起来。
golang 的面向对象表达更直观,对于面向过程只是换了一种语法形式来表达方法施加的对象不需要非得是指针,也不用非得叫 this。
切片(slice)、字典(map)、通道(channel)、接口(interface)。
main 函数不能带参数;main 函数不能定义返回值。main 函数所在的包必须为 main 包;main 函数中可以使用 flag 包来获取和解析命令行参数。
空指针解析
下标越界
除数为0
调用 panic 函数
beego 是一个 golang 实现的轻量级HTTP框架
beego 可以通过注释路由、正则路由等多种方式完成 url 路由注入
可以使用 bee new 工具生成空工程,然后使用 bee run 命令自动热编译
goconvey 是一个支持 golang 的单元测试框架
goconvey 能够自动监控文件修改并启动测试,并可以将测试结果实时输出到web界面
goconvey 提供了丰富的断言简化测试用例的编写
GoStub 可以对全局变量打桩
GoStub 可以对函数打桩
GoStub 不可以对类的成员方法打桩
GoStub 可以打动态桩,比如对一个函数打桩后,多次调用该函数会有不同的行为