1.类型介绍

Go语言中,有基本数据类型(原生数据类型)和复合数据类型(派生数据类型)。

image-20201118214224831

2.值类型

2.1 整型

整型分两大类:

  • 有符号整型:int8、int16、int32(别名:rune)、int64、int。

  • 无符号整型:uint8(别名:byte)、uint16、uint32、uint64、uint。

整型取值范围:

image-20201114224740194

2.2 浮点数

浮点型表示存储的数据是实数,浮点类型分: float32float64 两种,默认是float64

类型 字节 说明
float32 4 32位的浮点型
float64 8 64位的浮点型

声明使用:

var x float32 // 声明32位浮点型
  • 常量math.MaxFloat32表示float32能获取的最大值,大约是3.4×1038;
  • 常量math.SmallestNonzeroFloat32表示float32能获取的最小值,大约为1.4×10-45。
  • 常量math.MaxFloat64表示float64能获取的最大值,大约是1.8×10308;
  • 常量math.SmallestNonzeroFloat64表示float64能获取的最小值,大约为4.9×10-324。

2.3 布尔类型

布尔值的类型为bool,值是true或false,默认为false

2.4 字符串

字符串都是采用UTF-8字符集编码。字符串是用一对双引号(””)或反引号(` `)括起来定义,字符串不可变,可以用 + 操作符 连接两个字符串

声明使用:

// 单行字符串
s := "hello word"

// 多行字符串

s := `这是一个段落,
此处的换行会原样输出。
`

2.5 字符

字符串中的每一个元素叫作“字符”,定义字符时使用单引号。Go语言的字符有两种,如下表:

类型 字节 说明
byte 1 表示UTF8字符串中的单个字节的值,别名:unit8
rune 4 表示单个unicode字符,别名:int32

声明使用:

var a byte = 'a' // 注意是单引号
var b rune = '六'

2.6 数组(array)

语法: var 数组变量名 [数组长度]T

说明:
● 数组变量名:数组声明及使用时的变量名。
● 元素数量:数组的元素数量。
可以是一个表达式,但最终通过编译期计算的结果必须是整型数值。
也就是说,元素数量不能含有到运行时才能确认大小的数值。
T可以是任意基本类型,包括T为数组本身。但类型为数组本身时,可以实现多维数组

声明使用:

var arr [3]int  //默认初始化0
var q [3]int = [3]int{1,2,3}
q := [...]int{1,2,3}
q := [...]int{90:-1}//key和value的赋值方式,下表90的值为-1,数组长度为91

如果在 数组的长度 位置出现的是“…”省略号,则表示数组的长度是根据初始化值的 个数来计算

2.7 结构体(struct)

结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。

 /* 声明结构体 */
type 结构体名称 struct {
属性1 类型
属性2 类型
...
}

/* 使用示例 */
type User struct {
name string
age int
}

user := new(User)
user.name = "tom"
user.age = 20

结构体的初始化可以使用new关键词和var关键词,不同的是如果使用new,则返回类型是一个指针,使用var,则是结构体自身。

3. 引用类型

3.1 切片(slice)

创建slice主要两种:1.基于数组创建。2.直接创建

1.基于数组创建

arrVar := [4]int{1, 2, 34} 

sliceVar := arrVar[1:3]

数组arrVar和sliceVar里面的地址其实是一样的,也就是说如果你改变sliceVar里面的变量,那么arrVar里面的变量也会随之改变。

2.直接创建

myslice1 := make([]int,5)//创建一个元素个数5的slice,cap也是5
myslice2 := make([]int,5,10)//创建一个元素个数5的slice,cap是10
myslice3 := []int{1,2,3,4}//创建一个元素个数为4的slice,cap是4
var slice []int //创建一个空的slice,cap和len都是0

可以使用内置的make()函数来创建。事实上还是会创建一个匿名的数组,只是不需要我们来定义。

3.2 映射(map)

可以使用内建函数 make 也可以使用 map 关键字来定义 Map:

 /* 声明变量,默认 map 是 nil */
var myMap map[keyType]valueType

//示例1
ages := map[string] int {
"tom": 21,
"anny": 18,
}

/* 使用 make 函数 */
myMap := make(map[keyType]valueType)

//示例1相当于
ages := make(map[string]int)
ages["tom"] = 21
ages["anny"] = 18

myMap是声明的变量名,keyType是对应的Key的类型,valueType是value的类型。

4.常量

程序编译阶段就确定下来的值,而程序在运行时则无法改变该值。在Go语言程序中,常量可定义为数值、布尔值或字符串等类型。常量定义后未被使用,不会在编译时报错。

常量中的数据类型只可以是布尔型、数字型(整型、浮点型和复数型)和字符串。

语法:

const 常量名 [常量类型] = 常量值 // 常量类型可以省略
const PI float32 = 3.1415
const AGE = 100
const Prex = "Go_"

4.1 iota 枚举

Go语言里面有一个关键字iota,这个关键字用来声明enum的时候采用,它默认开始值是0,每调用一次加1。,每个const分组的第一个常量被默认设置为它的0值,第二及后续的常量被默认设置为它前面那个常量的值,如果前面那个常量的值是iota,则它也被设置为iota。

const(
x = iota // x == 0
y = iota // y == 1
z = iota // z == 2
w // 常量声明省略值时,默认和之前一个值的字面相同。这里隐式地说 w = iota,因此w == 3。其实上面y和z可同样不用"= iota"
)
const v = iota // 每遇到一个const关键字,iota就会重置,此时v == 0

每遇到一个const关键字,iota就会重置

5. 复数型

默认类型是complex128(64位实数+64位虚数)。如果需要小一些的,也有complex64(32位实数+32位虚数)。复数的形式为RE+IMi其中RE是实数部分,IM是虚数部分,而最后的i是虚数单位。

声明使用:

var c complex64 = 5 + 5i