数据容器
coderzhouyu
数据容器
变量
var a int
var b string
var c float64
var d [5] int //数组
var e [] int //数组切片
var f * int //正确
var v1 int = 5 //正确
var v2 = 5 //正确,编译器自动推导出V2类型
v3 := 5 //正确,编译器自动推导出V3的类型
// 多重赋值
i := 2
j := 3
i, j = j, i //交换i和j的值,此时i == 3,j == 2
常量
const limit = 512
const top uint16 = 1421
const Pi float64 = 3.1415926
const x,y int = 1,3 //多重赋值
const (
Cyan = 0
Black = 1
White = 2
)
// iota是一个可以被编译器修改的常量,在const关键字出现时被重置为 0,在下一个 const 出现之前,每出现一次 iota,其所代表的数字自动加 1
const (
a = iota //a == 0
b = iota //b ==1
c = iota //c == 2
)
const d = iota //d==0,因为const的出现,iota被重置为0
数据类型
整型
类型 | 说明 |
---|---|
byte | 等同于 uint8 |
int | 依赖于不同平台下的实现,可以是 int32 或者 int64 |
int8 | [-128, 127] |
int16 | [-32768, 32767] |
int32 | [-2147483648, 2147483647] |
int64 | [-9223372036854775808, 9223372036854775807] |
rune | 等同于 int32 |
uint | 依赖于不同平台下的实现,可以是 uint32 或者 uint64 |
uint8 | [0, 255] |
uint16 | [0, 65535] |
uint32 | [0, 4294967295] |
uint64 | [0, 18446744073709551615] |
uintptr | 一个可以恰好容纳指针值的无符号整型(对 32 位平台是 uint32, 对 64 位平台是 uint64) |
在C
语言中我们可以通过sizeof
操作符查看类型的字节长度,在 Go 语言中可以通过unsafe.Sizeof
函数进行,使用vim
创建源文件type_length.go
,输入以下代码:
package main
import (
"fmt"
"unsafe"
)
func main() {
a := 12
fmt.Println("length of a: ", unsafe.Sizeof(a))
var b int = 12
fmt.Println("length of b(int): ", unsafe.Sizeof(b))
var c int8 = 12
fmt.Println("length of c(int8): ", unsafe.Sizeof(c))
var d int16 = 12
fmt.Println("length of d(int16): ", unsafe.Sizeof(d))
var e int32 = 12
fmt.Println("length of e(int32): ", unsafe.Sizeof(e))
var f int64 = 12
fmt.Println("length of f(int64): ", unsafe.Sizeof(f))
}
浮点型
golang 没有 double 类型
类型 | 说明 |
---|---|
float32 | ±3.402 823 466 385 288 598 117 041 834 845 169 254 40x1038 计算精度大概是小数点后 7 个十进制数 |
float64 | ±1.797 693 134 862 315 708 145 274 237 317 043 567 981x1038 计算精度大概是小数点后 15 个十进制数 |
complex32 | 复数,实部和虚部都是 float32 |
complex64 | 复数,实部和虚部都是 float64 |
布尔类型
var a bool
a = true
b := (2 == 3) //b也会被推导为bool类型
//错误示范 布尔类型不能接受其他类型的赋值,不支持自动或强制的类型转换
var b bool
b = 1 //编译错误
b = bool(1) //编译错误
数组
实际工作中用切片更多
//[length]Type
arr1 := [3]int
//[N]Type{value1, value2, ..., valueN}
arr2 := [5]string{"a","b","c","d","e"}
// 如果使用了...(省略符)操作符,Go 语言会为我们自动计算数组的长度
//[...]Type{value1, value2, ..., valueN}
arr2 := [...]float64{2.23,2.24,2.25}
切片
// make([ ]Type, length, capacity)
// length 指的是为这个类型分配多少个元素,capacity 为预分配的元素数量,这个值设定后不影响 length,只是能提前分配空间,降低多次分配空间造成的性能问题。
s1 := make([]int,5,3)
// make([ ]Type, length)
s2 := make([]string,2)
// [ ]Type{}
s3 := []float32{}
// [ ]Type{value1, value2, ..., valueN}
s4 := []float32{2.1,2.2}
字符串
t1 := "\"hello\"" //内容: "hello"
t2 := `"hello"` //内容:和t1一致
t3 := "\u6B22\u8FCE" //内容:欢迎
// 大段文字
t4 := `
这事一个段落
这事一个段落
这事一个段落
`
字典(映射)
package main
import "fmt"
func main() {
var mapLit map[string]int
var mapAssigned map[string]int
mapLit = map[string]int{"one": 1, "two": 2}
mapCreated := make(map[string]float32)
mapAssigned = mapLit
mapCreated["key1"] = 4.5
mapCreated["key2"] = 3.14159
mapAssigned["two"] = 3
fmt.Printf("Map literal at \"one\" is: %d\n", mapLit["one"])
fmt.Printf("Map created at \"key2\" is: %f\n", mapCreated["key2"])
fmt.Printf("Map assigned at \"two\" is: %d\n", mapLit["two"])
fmt.Printf("Map literal at \"ten\" is: %d\n", mapLit["ten"])
}