[golang] 数据类型及变量
[golang] 数据类型及变量
零值
未显式指定初始值的变量会自动获取零值,具体来说,
- 整形:
0
- 浮点:
0.0
- 布尔类型:
false
- 字符串:
""
(空字符串) - interfaces,slices,channels,maps,pointers 及 functions:
nil
字面量
- 对于数字字面量,可在值中穿插
_
分隔以提高可读性,比如每三个数字之间插入1_234
。
整形
- 根据可存储大小,整形分很多种,一些常用的类型有自己的别名
byte
: uint8int
: int32/int64, 依平台而定uint
: 同 int 只不过是无符号类型rune
:用来表示字符,值同 int32- TODO:
uintptr
类型怎么选
- 大部分场景直接用
int
- 操作二进制文件,网络编程中协议及符号处理,使用对应大小的整形类型
- 编写库函数需要兼容所有整形,则准备两个函数,一个使用
int64
一个用uint64
浮点型
大部分情况直接用 float64
。
注意:
- 浮点不能精准表示数字,所以不要用于金钱等需要高精度的情形。
- 也是因为不精准的原因,不要使用
==
,!=
来对比两个浮点数。正确的做法是相减,判断差值是否在预期范围内。
变量的声明
Go 中支持多种方式灵活声明变量。
- 完整的声明形式,包含类型同时赋值
var x int = 1
- 有初始值的情况下,可省略类型
var x = 1
- 当然也可次声明了不赋值,此时需要指定类型
var x int
- 可同时声明多个变量,甚至包含不同类型
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"
同时声明多个变量的方式也适用于该操作符:
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
作为计数器。简写变量名的好处一是使得代码简洁,书写高效;另一个好处是不容易写出逻辑复杂的代码块,如果发现变量名不容易维护了,说明应该考虑将逻辑进行拆分而不是揉在一起。
如果是全局包变量,则恰恰相反,应该尽量取得详尽一些。