零值
未显式指定初始值的变量会自动获取零值,具体来说,
- 整形:
0
- 浮点:
0.0
- 布尔类型:
false
- 字符串:
"" (空字符串)
- interfaces,slices,channels,maps,pointers 及 functions:
nil
字面量
- 对于数字字面量,可在值中穿插
_ 分隔以提高可读性,比如每三个数字之间插入 1_234 。
整形
- 根据可存储大小,整形分很多种,一些常用的类型有自己的别名
byte : uint8
int : int32/int64, 依平台而定
uint : 同 int 只不过是无符号类型
rune :用来表示字符,值同 int32
- TODO:
uintptr
类型怎么选
- 大部分场景直接用
int
- 操作二进制文件,网络编程中协议及符号处理,使用对应大小的整形类型
- 编写库函数需要兼容所有整形,则准备两个函数,一个使用
int64 一个用 uint64
浮点型
大部分情况直接用 float64 。
注意:
- 浮点不能精准表示数字,所以不要用于金钱等需要高精度的情形。
- 也是因为不精准的原因,不要使用
== , != 来对比两个浮点数。正确的做法是相减,判断差值是否在预期范围内。
变量的声明
Go 中支持多种方式灵活声明变量。
var foo, bar int
var x,y = 1, "hello"
var (
x int
y, z int = 1, 2
m, foo = 9, "foo"
bar = "hello"
)
:= 操作符
另一个常用的形式是缩写形式,但仅限于函数体内,使用 := 符号来声明和初始化变量
x := 10
// 等效于
var x int = 10
//
m, foo := 10, "hello"
同时声明多个变量的方式也适用于该操作符:
该形式不仅可用来声明新的变量,还可同时设置已有变量,前提是符号左边至少有一个新声明的变量即可。
var x = 10
x, y := 11, "hello"
fmt.Println(x, y)
// 11 hello
const 常量
const 声明的常量是编译时的,即声明时必需初始化,且用来初始化的值是已经确定的。
常量分为有类型(Typed)与无类型(UnTyped)常量,前者在赋值时需要目标变量类型匹配,后者没有这个限制。
const x float64 = 3.3
var y float64 = x
var z int = x // 🚨 cannot use x (constant 3.3 of type float64) as int value in variable declarationcompilerIncompatibleAssign
const x = 3
var y float64 = x
var z int = x // ✅
变量名
和其他语言不同,对于变量名,Go 中仅要求以下划线或字母开头,所使用的字母可以是任意 Unicode 字符,所以如下示例中都是合法的变量名:
_x := 1
_å := "a symbol"
π := 3.14
虽然变量名中支持包含下划线,但不提倡使用蛇形 (snack case)命名法,推荐使用驼峰。
函数名尽量简洁,甚至大部分情况下提倡使用单个字母,比如 for-range 语法中使用 k v 代表 key value 循环变量,一般 for 循环中常用 i j 作为计数器。简写变量名的好处一是使得代码简洁,书写高效;另一个好处是不容易写出逻辑复杂的代码块,如果发现变量名不容易维护了,说明应该考虑将逻辑进行拆分而不是揉在一起。
如果是全局包变量,则恰恰相反,应该尽量取得详尽一些。
相关资源
|