分号
若在一行最后一个标识符为以下类型
- 数字
- 字符串常量
- 特殊标识符号;break continue fallthrough return ++ — ) }
词法分析器会在标识符后添加分号, 与C不同GO很多地方都省略分号。
另在在if for switch select控制结构后要接 “{”, 例如:
if i < f() { g() }
而不要写成
if i < f() { g() }
控制结构
if/switch/for
- If switch语句中可以接受初始化语句
if err := file.Chmod(0664); err != nil { log.Print(err) return err }
- For 遍历数组,切片,字符串或者map时,可以使用range子句
for key, value := range oldMap { newMap[key] = value }
- Switch中有两个比较特殊的地方,
break跳出指定一个标签范围:
Loop: for n := 0; n < len(src); n += size { switch { case src[n] < sizeOne: if validateOnly { break } size = 1 update(src[n]) case src[n] < sizeTwo: if n+1 >= len(src) { err = errShortInput break Loop } if validateOnly { break } size = 2 update(src[n] + src[n+1]<<shift) } }
与C不同他不仅支持整数,枚举还支持类型判断
var t interface{} t = functionOfSomeType() switch t := t.(type) { default: fmt.Printf("unexpected type %T\n", t) // %T prints whatever type t has case bool: fmt.Printf("boolean %t\n", t) // t has type bool case int: fmt.Printf("integer %d\n", t) // t has type int case *bool: fmt.Printf("pointer to boolean %t\n", *t) // t has type *bool case *int: fmt.Printf("pointer to integer %d\n", *t) // t has type *int }
- 其他
if语句中支持初始化语句
if err := file.Chmod(0664); err != nil { log.Print(err) return err }
平行赋值,可以实现变量交换。
a := 1 b := 2 a, b = b, a
a = 2, b = 1
++,–认为是一个语句, 不是一个操作符,单启一行。
a := 1 a++ b := 2 b++ a, b = b, a
a = 3, b = 2
函数
函数主要是两个特征
- 多返回值
func returnMulitValues() (int, int) { return rand.Intn(10), rand.Intn(100) } func TestFn(t *testing.T) { a, b := returnMulitValues() t.Log(a, b) }
- defer 有些类似C++中的析构函数,可以利用他的特性释放资源。防止遗漏。
func TestDefer(t *testing.T) { defer func() { t.Log("Clear resources") }() t.Log("Started") panic("Fatal error") }
- 其他
可以给返回值命名
func nextInt(b []byte, pos int) (value, nextPos int) {
参考及引用
Photo by Lachlan Ross from Pexels
https://golang.org/doc/effective_go
Comments are closed.