[golang] 数据类型及变量

零值

未显式指定初始值的变量会自动获取零值,具体来说,

  • 整形: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 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 作为计数器。简写变量名的好处一是使得代码简洁,书写高效;另一个好处是不容易写出逻辑复杂的代码块,如果发现变量名不容易维护了,说明应该考虑将逻辑进行拆分而不是揉在一起。

如果是全局包变量,则恰恰相反,应该尽量取得详尽一些。

相关资源