for 循环支持 continue 和 break 来控制循环,但是它提供了一个更高级的break,可以选择中断哪一个循环 for 循环不支持以逗号为间隔的多个赋值语句,必须使用平行赋值的方式来初始化多个变量。
在 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。
数组切片、字典(map)、通道(channel)、接口(interface)。
可以通过“&”取指针的地址;可以通过“*”取指针指向的数据。
main 函数不能带参数;main 函数不能定义返回值。
main 函数所在的包必须为 main 包;main 函数中可以使用 flag 包来获取和解析命令行参数。