1、基本数据类型
// 整型 int int8 int16 int32 int64 // 无符号整型 uint uint8 uint16 uint32 uint64 // 浮点类型 float32 float64 // 复数 complex64 complex128 // 布尔类型 bool // 字符 string // 字节,uint8的别名 byte // int32的别名,表示一个Unicode 码点 rune
数据类型
2、变量的默认值(零值)
当一个变量或者新值被创建时, 如果没有为其明确指定初始值,go语言会自动初始化其值为此类型对应的零值
Go语言中无论是全局变量还是局部变量,只要定义了一个变量都有默认的0值
int/int8/int16/int32/int64/uint/uint8/uint16/uint32/uint64/byte/rune/uintptr的默认值是0float32/float64的默认值是0.0bool的默认值是falsestring的默认值是""pointer/function/interface/slice/channel/map/error的默认值是nil,特别注意,slice、map的默认值是nil其它复合类型array/struct默认值是内部数据类型的默认值package main import "fmt" func main() { var intV int // 整型变量 var floatV float32 // 实型变量 var boolV bool // 布尔型变量 var stringV string // 字符串变量 var pointerV *int // 指针变量 var funcV func(int, int) int // function变量 var interfaceV interface{} // 接口变量 var sliceV []int // 切片变量 var channelV chan int // channel变量 var mapV map[string]string // map变量 var errorV error // error变量 fmt.Println("int = ", intV) // 0 fmt.Println("float = ", floatV) // 0 fmt.Println("bool = ", boolV) // false fmt.Println("string = ", stringV) // "" fmt.Println("pointer = ", pointerV) // nil fmt.Println("func = ", funcV) // nil fmt.Println("interface = ", interfaceV) // nil fmt.Println("slice = ", sliceV) // [] fmt.Println("slice = ", sliceV == nil) // true fmt.Println("channel = ", channelV) // nil fmt.Println("map = ", mapV) // map[] fmt.Println("map = ", mapV == nil) // true fmt.Println("error = ", errorV) // nil var arraryV [3]int // 数组变量 type Person struct { name string age int } var structV Person // 结构体变量 fmt.Println("arrary = ", arraryV) // [0, 0, 0] fmt.Println("struct = ", structV) // {"" 0} }
3、整型占用字节问题
int,uint整型:和机器平台有关,32位,占用4个字节;64位,占用8个字节。
Go语言各数据类型占用内存空间类型
32位编译器
64位编译器
本质
int8/uint8
1
1
signed char/unsigned char
int16/uint16
2
2
signed short/unsigned short
int32/uint32
4
4
signed int/unsigned int
int64/uint64
8
8
signed long long int/unsigned long long int
byte
1
1
uint8/unsigned char
rune
4
4
int32/signed int
int
4
8
根据机器位数决定长度
uintptr
4
8
根据机器位数决定长度 uint32/uint64
float32
4
4
float
float64
8
8
double
true
1
1
char类型的整型
false
1
1
char类型的整型
和C语言一样,Go语言也提供了Sizeof计算变量的内存空间
1.导入import "unsafe"包2.通过unsafe.Sizeof()计算变量内存空间注意点: 企业开发中一般使用int, 因为int会根据当前的操作系统自动转换为int32和int64。
4、类型转换
不支持不同类型之间的隐式转换;
func TestImplicit(t *testing.T) { var a int = 1 var b int64 b = a t.Log(a, b) } // output: cannot use a (type int) as type int64 in assignment
即便是类型别名和同类型之间也不可以。
type MyInt int64 func TestImplicit(t *testing.T) { var a int = 1 var b int64 b = int64(a) t.Log(a, b) var c MyInt c = b t.Log(c) } // output: cannot use b (type int64) as type MyInt in assignment
5、数值范围
类型
长度(字节)
数值范围
int8
1
-128~127 (-2^(8-1) ~ 2^7-1),之一位是符号位,要去掉
uint8
1
0~255 (0 ~ 2^8-1)
int16
2
-32768~32767
uint16
2
0~65535
int32
4
-2^31 ~ 2^31-1 (-2147483648~2147483647)
uint32
4
0~2^32-1 (0~4294967295)
int64
8
-2^63 ~2^63-1
uint64
8
0~2^63-1
6、int占用字节数测试
//机器位数 cpu := runtime.GOARCH //int占用位数 int_size := strconv.IntSize
7、string类型
string 是值类型。默认初始化值是空字符串,不是nil(string类型零值为空字符串)
func TestString(t *testing.T) { var s string t.Logf("%T %q", s, s) //string "" }
8、指针
使用&来表示指向变量
go不支持指针运算
func TestPoint(t *testing.T) { a := 1 aPtr := &a // 用&来表示指向变量a的指针 aPtr = aPtr + 1 // 不支持运算 t.Log(a, aPtr) t.Logf("%T %T", a, aPtr) // %T表示获取变量类型 } // output:invalid operation: aPtr + 1 (mi***atched types *int and int)