go基础-数据类型二

首页 / Golang / 正文

数据类型

概览

基本数据类型

  • 布尔类型:bool
  • 整型:int8、byte、int16、int、uint、uintptr 等
  • 浮点类型:float32、float64
  • 复数类型:complex64、complex128
  • 字符串:string
  • 字符类型:rune
  • 错误类型:error

复合类型

  • 指针(pointer)
  • 数组(array)
  • 切片(slice)
  • 字典(map)
  • 通道(chan)
  • 结构体(struct)
  • 接口(interface)

复合数据类型

数组

var a [8]byte // 长度为8的数组,每个元素为一个字节
var b [3][3]int // 二维数组(9宫格)
var c [3][3][3]float64 // 三维数组(立体的9宫格)
var d = [3]int{1, 2, 3}  // 声明时初始化
var e = new([3]string)   // 通过 new 初始化
a := [5]int{1,2,3,4,5}
a := [...]int{1, 2, 3} // 省略长度声明
a := [5]int{1, 2, 3} // 初始化的时候长度是5,而填充了3个数据,那么剩余的两位会用0填充 [1 2 3 0 0]
a := [5]int{1: 3, 3: 7} // 指定下标位置的元素值 [0 3 0 7 0]

数组长度在声明后就不可更改

数组的长度在定义之后无法修改,数组长度是数组类型本身的一部分,是数组的一个内置常量,因此我们无法在数组上做动态的元素增删操作。

数组元素的访问和设置

arr := [5]int{1,2,3,4,5}
a1, a2 := arr[0], arr[len(arr) - 1] // a1=1 a2=5
arr[0] = 10 // 设置数组第一个元素的值为10 [10 2 3 4 5]

切片

var slice []string = []string{"a", "b", "c"} // 声明一个切片
// 基于数组创建一个切片
months := [...]string{"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} // 定义一个月份的数组
q2 := months[3:6]    // 第二季度 [April May June]
summer := months[5:8]  // 夏季 [June July August]
all := months[:] // 全年数据
firsthalf := months[:6] // 上半年
secondhalf := months[6:] // 下半年
切片底层引用了一个数组,由三个部分构成 —— 指针、长度和容量,指针指向数组起始下标,长度对应切片中元素的个数,容量则是切片起始位置到底层数组结尾的位置,切片长度不能超过容量
len(q2) // 获取切片长度
cap(q2) // 获取切片容量

// 切片长度不能超过容量
// 直接创建一个切片
mySlice1 := make([]int, 5, 10) // 初始长度为5的整型,容量为10的切片
mySlice3 := []int{1, 2, 3, 4, 5} // 这种方式创建的,长度和容量都是5

字典map

// map 字典类型 string 字典键的类型 int 字典值的类型
var testMap map[string]int
testMap := map[string]int{
  "one": 1,
  "two": 2,
  "three": 3,
}
// 像切片那样用make创建,第二个参数100是初始容量,超出会自动扩容
var testMap = make(map[string]int, 100)
// 注意,用make初始化后,只能像下边这样进行赋值
testMap["one"] = 1
testMap["two"] = 2

指针类型

变量的本质对一块内存空间的命名,我们可以通过引用变量名来使用这块内存空间存储的值,而指针则是用来指向这些变量值所在内存地址的值
var ptr *int // 声明指针类型, 指针的默认值是<nil>
a := 100
ptr = &a      // 初始化指针类型值为变量 a 这时ptr打印的时候应该是内存地址的值
fmt.Println(ptr) // 0x1400011a008
fmt.Println(*ptr) // 100

b := 200
ptr1 := &b
fmt.Println(ptr1) // 0x1400001e060
*ptr1 = 100
fmt.Println(*ptr1) // 100
fmt.Println(b) // 100

指针类型转化

i := 10
var p *int = &i
var fp *float32 = (*float32)(unsafe.Pointer(p))
*fp = *fp * 10
fmt.Println(i)  // 100
打赏
评论区
头像
文章目录