分号
若在一行最后一个标识符为以下类型
- 数字
- 字符串常量
- 特殊标识符号;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.