golang基础知识查漏补缺(持续更新)

时间:2023-02-26 15:57:24

表达式与语句

简单来说,一个表达式表示一个值,而一条语句表示一个操作。 但是在实际中,有些个表达式可能同时表示多个值,有些语句可能是由很多更基本的语句组成的。 另外,根据场合不同,某些语句也可以被视为表达式。

参考链接:​https://www.bookstack.cn/read/Golang101-v1.16.a-1/expressions-and-statements.html​

布尔值

布尔值可以和&&(AND)和||(OR)操作符结合,并且有短路行为:如果运算符左边值已经可以确定整个布尔表达式的值,那么运算符右边的值将不再被求值,因此下面的表达式总是安全的:

s != "" && s[0] == 'x'

其中s[0]操作如果应用于空字符串将会导致panic异常。

因为​​&&​​的优先级比​​||​​高(助记:​​&&​​对应逻辑乘法,​​||​​对应逻辑加法,乘法比加法优先级要高),下面形式的布尔表达式是不需要加小括弧的:

if 'a' <= c && c <= 'z' ||
'A' <= c && c <= 'Z' ||
'0' <= c && c <= '9' {
// ...ASCII letter or digit...
}

布尔值并不会隐式转换为数字值0或1,反之亦然。必须使用一个显式的if语句辅助转换:

i := 0
if b {
i = 1
}

如果需要经常做类似的转换,包装成一个函数会更方便:

// btoi returns 1 if b is true and 0 if false.
func btoi(b bool) int {
if b {
return 1
}
return 0
}

数字到布尔型的逆转换则非常简单,不过为了保持对称,我们也可以包装一个函数:

// itob reports whether i is non-zero.
func itob(i int) bool { return i != 0 }

字符串面值

字符串值也可以用字符串面值方式编写,只要将一系列字节序列包含在双引号内即可:

"Hello, world"

在一个双引号包含的字符串面值中,可以用以反斜杠​​\​​开头的转义序列插入任意的数据。下面的换行、回车和制表符等是常见的ASCII控制代码的转义方式:

\a      响铃
\b 退格
\f 换页
\n 换行
\r 回车
\t 制表符
\v 垂直制表符
\' 单引号(只用在 '\'' 形式的rune符号面值中)
\" 双引号(只用在 "..." 形式的字符串面值中)
\\ 反斜杠

一个原生的字符串面值形式是`...`,使用反引号代替双引号。在原生的字符串面值中,没有转义操作;全部的内容都是字面的意思,包含退格和换行,因此一个程序中的原生字符串面值可能跨越多行(译注:在原生字符串面值内部是无法直接写`字符的,可以用八进制或十六进制转义或+"`"连接字符串常量完成)。唯一的特殊处理是会删除回车以保证在所有平台上的值都是一样的,包括那些把回车也放入文本文件的系统(译注:Windows系统会把回车和换行一起放入文本文件中)。

原生字符串面值用于编写正则表达式会很方便,因为正则表达式往往会包含很多反斜杠。原生字符串面值同时被广泛应用于HTML模板、JSON面值、命令行提示信息以及那些需要扩展到多行的场景。

const GoUsage = `Go is a tool for managing Go source code.

Usage:
go command [arguments]
...`