Go语言中,数据类型用于声明函数参数和变量,这篇笔记我们介绍Go语言中的数据类型相关的概念。
Go语言是强类型语言,声明的每个变量都需要绑定到特定的数据类型,并且它只接受与此类型匹配的赋值。Go语言数据类型分为两大类,值类型(Value Types)和引用类型(Reference Types)。
对于引用类型,它存储的是指向数据的地址而不是数据本身,当引用类型的变量被赋值或作为函数参数传递时,实际上是将该地址进行了复制,它们实际指向的可能是同一份数据。
Go语言中有如下基本类型。
bool
string
int int8 int16 int32 int64 // int类型长度取决于CPU字长
uint uint8 uint16 uint32 uint64 uintptr // 和int相同,uint长度取决于CPU字长
byte // uint8的别名
rune // int32的别名,通常用于代表一个Unicode码
float32 float64
complex64 complex128 // 复数类型
这里注意,关于何时用int
何时用int32
此类问题,和C/C++是一样的,如非特殊需求我们就应该用int
,编译器会对目标平台进行优化,选择合适的数据类型;而网络传输、二进制格式读写等,则必须要用类似int32
等确定类型。
Go语言中的指针和C/C++类似,代表变量在内存中的地址。在特定的情况下,我们应该选用指针,以实现引用传递,或是减少内存拷贝开销。
Go指针和C/C++写法类似,我们可以使用取地址符&
获取一个变量的指针,使用解引用符*
获取指针指向的变量,不过区别是Go语法都是倒着写的,指针也是类似*int
的形式。
var i int = 0
var iPtr *int = &i // 声明指针并赋值
var j int = *iPtr // 指针解引用
指针能够实现引用传递,如果作为函数参数传入,我们可以修改参数指针指向的内存地址,下面代码我们使用指针传递了一个int
类型的变量。
package main
import "fmt"
func foo(i *int) {
*i = 1
}
func main() {
var i int = 0
foo(&i)
fmt.Printf("%v", i)
}
最终i
的值为1
。
type
关键字可以为类型取别名,类似C/C++的typedef
。
type dataLength int32
var i dataLength = 0
当然,个人不建议使用type
关键字定义一大堆令人迷惑的类型,这会严重降低代码的可读性和可扩展性。实际上type
关键字的主要用途是给结构体起别名,一般不推荐在其它地方使用。