Go 语言教程(2)——表达式

保留关键字

语言设计简练,只有 25 个保留关键字。

break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var

运算符

全部运算符、分隔符、以及其他符号。

+ & += &= && == != ( )
- | -= |= || < <= [ ]
* ^ *= ^= <- > >= { }
/ << /= <<= ++ = := , ;
% >> %= >>= -- ! ... . :
 &^ &^=

运算符结合率从左到右。

优先级   运算符
------------+---------------------------------------------+----------------------------
high    * / & << >> & &^
        + - | ^
        == != < <= < >=
        <- 
        &&
low     ||

简单位运算

0110 & 1011 = 0010 AND 都为 1。
0110 | 1011 = 1111 OR ⾄少⼀个为 1。
0110 ^ 1011 = 1101 XOR 只能⼀个为 1。
0110 &^ 1011 = 0100 AND NOT 清除标志位

a := 0
a |= 1 << 2 // 0000100: 在 bit2 设置标志位
a |= 1 << 6 // 1000100: 在 bit6 设置标志位
a = a &^ (1 << 6) // 0000100: 清除 bit6 标志位

x := 1
^x // 取反运算 -0010

初始化

初始化复合对象,必须使用类型标签,且左大括号必须在类型尾部。

var a = struct{x int}{100}
var b = []int{1, 2, 3}

If

  • 可以省略条件表达式括号
  • 支持初始化语句,可以定义代码块局部变量
  • 代码块左大括号必须在条件表达式尾部
x := 0

// 局部变量 n 只能在循环中使用
if n := "abc"; x > 0 {
    println(n[0])
} else if x < 0 {
    println(n[1])
} else {
    println(n[2])
}

不支持三元操作符 a > b ? a : b

For

For 支持三种循环方式,Go 中没有 while 关键字语法,可以用 For 模拟。

s := "abc"

// 常见 For 循环
// 计算出长度 n,避免多次调用 len 函数
for i, n := 0, len(s); i < n; i++ {
    println(s[i])
}

// 替代 while (n > 0) {}
n := len(s)
for n > 0 {
    println(s[n])
    n--
}

// 替代 while (true) {}
for {
    println(s)
}

Range

类似迭代器操作,返回 (索引, 值)或(键, 值)

Range 会复制对象,应该使用引用类型 slice、map。

for 循环的 range 格式可以对 slice 或者 map 进行迭代循环。

遍历 slice 时,返回当前的下标和该下标对应元素的一个拷贝

s := []int{1, 2, 3, 4, 5}

for i, v := range s { // 复制 struct slice { pointer, len, cap }
    if i == 0 {
        s = s[:3] // 对 slice 修改,不会影响 range
        s[2] = 100 // 对底层数据的修改
    }

    println(i, v)
}

输出:

0 1
1 2
2 100
3 4
4 5

Switch

分支表达式可以是任意类型,不限于常量。可以省略 break,默认自动终止。

继续下一分支,可以使用 fallthrough,但不再判断条件。

x := []int{1, 2, 3}
i := 2

switch i {
    case x[1]:
        println("1")
        fallthrough
    case 1, 3:
        println("2")
    default:
        println("3")
}

输出
1
2

省略条件表达式,可以当 if…else if…else 使用。

switch {
    case x[1] > 0: // if
        println("1")
    case x[1] < 0: // else if
        println("2")
    default: // else
        println("3")
}

// 带初始化语句
switch i := x[2]; {
    case x[1] > 0: // if
        println("1")
    case x[1] < 0: // else if
        println("2")
    default: // else
        println("3")
}

Goto、Break、Continue

⽀持在函数内 goto 跳转。标签名区分⼤⼩写,未使⽤标签引发错误。

func main() {
    var i int
    for {
        println(i)
        i++
        if i > 2 { goto BREAK }
}
BREAK:
    println("break")
EXIT: // Error: label EXIT defined and not used
}

配合标签,breakcontinue 可在多级嵌套循环中跳出。

func main() {
L1:
    for x := 0; x < 3; x++ {
L2:
        for y := 0; y < 5; y++ {
            if y > 2 { continue L2 }
            if x > 1 { break L1 }

            print(x, ":", y, " ")
        }
        
        println()
    }
}

输出
0:0 0:1 0:2
1:0 1:1 1:2

break 可⽤于 for、switch、select,⽽ continue 仅能⽤于 for 循环。

    原文作者:浮x尘
    原文地址: https://www.jianshu.com/p/21b90af6ea8f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞