目录
数据类型
指针
结构体
数组
切片
切片的方法
映射
函数闭包
结束语
前言: go 语言的第三篇文章, 主要讲述 go 语言中的数据类型, 包括指针, 结构体, 数组, 切片, 映射, 函数闭包等, 每个都提供了示例, 可直接运行.
数据类型
指针
指针保存了值的内存地址;
(* 操作符) 表示指针指向的底层值;
(& 操作符) 会生成一个指向其操作数的指针;
示例:
- func testPoint() {
- i := 20
- p := &i
- fmt.Println(*p)
- *p = 1
- fmt.Println(i)
- }
解读:*p 的值为 20 ,i 的值为 1
第一个输出: 通过指针 p 读取 i
第二个输出: 通过指针 p 设置 i
结构体
使用 struct 关键字表示一个结构体.
结构体就是一个字段的集合, 可以使用. 来取值
示例:
- /*struct*/
- type user struct {
- name string
- age int
- }
- func testStruct() {
- x := user{"mingyu", 23}
- fmt.Println("对象", x)
- fmt.Println("姓名", x.name)
- x.name = "xiaona"
- fmt.Println("从新设置姓名", x.name)
- // 通过指针访问
- y := &x
- fmt.Println(*y)
- fmt.Println(y.age)
- // 指定属性赋值
- z := user{age: 11}
- fmt.Println("对象", z)
- }
数组
类型 [n]T 表示拥有 n 个 T 类型的值的数组.
示例:
- // 数组
- func testArray() {
- arr := [2]int{1, 2}
- fmt.Println("数组", arr)
- // 指定下标赋值
- arr[1] = 10
- fmt.Println("数组", arr)
- }
切片
切片的感念是基于数组的, 通过指定数组的下标, 动态获取数组.
如: arr[1:3] 截取下标为 1 到 3 的数据 [下标前算后不算, 中间用: 分割]:
[1:3] 下标 1 到 3; [:2]: 下标 0 到 2 之前;[1:] 下标为 1.
切片并不存储任何数据, 它只是描述了底层数组中的一段, 所以修改切片数据, 数组数据也会改变.
切片 s 的长度和容量可通过表达式 len(s) 和 cap(s) 来获取, 零值是 nil.
示例:
- // 切片
- func testSection() {
- arr := [5]int{1, 2, 3, 4, 5}
- fmt.Println("数组", arr)
- simpleArr := arr[1:3]
- fmt.Println("切片", simpleArr)
- simpleArr[1] = 20
- fmt.Println("修改切片后的数组", arr)
- }
切片的方法
make:
make 创建切片 b := make([]int, 0, 5)
参数含义: 1. 类型, 2:len(长度),3:cap(容量);
append
追加切片数组 s = append(s, 2, 3, 4)
给切片 s 尾部追加元素 2,3,4
Range
用于 for 循环遍历切片或映射
每次迭代都会返回两个值: 第一个值为当前元素的下标, 第二个值为该下标所对应元素的一份副本
可以将下标或值赋予 _ 来忽略它
若你只需要索引, 去掉 value 的部分即可
示例:
- // 切片方法
- func testSectionFunc() {
- arr := make([]string, 0, 0)
- fmt.Println(len(arr), cap(arr), arr)
- arr = append(arr, "陈", "明羽")
- fmt.Println(len(arr), cap(arr), arr)
- for i, v := range arr {
- fmt.Println(i, v)
- }
- fmt.Println("-----------")
- for _, v := range arr {
- fmt.Println(v)
- }
- fmt.Println("-----------")
- for i := range arr {
- fmt.Println(i)
- }
- }
映射
将键映射到值, 也就是 map.
make 函数会返回给定类型的映射, 并将其初始化备用.
示例:
- // 映射
- func testMap() {
- m := make(map[string]user)
- m["1 号"] = user{
- "明羽", 23,
- }
- fmt.Println(m["1 号"])
- // 还可以这么写, 还是觉得这么写舒服
- var mor = map[string]user{
- "1 号": {
- "明羽", 23,
- },
- "2 号": {
- "小娜", 23,
- },
- }
- fmt.Println(mor)
- }
相关方法:
在映射 m 中插入或修改元素: m[key] = elem
获取元素: elem = m[key]
删除元素: delete(m, key)
通过双赋值检测某个键是否存在: elem, ok = m[key]
若 key 在 m 中, ok 为 true; 否则, ok 为 false.
若 key 不在映射中, 那么 elem 是该映射元素类型的零值
若 elem 或 ok 还未声明, 你可以使用短变量声明: elem, ok := m[key]
函数闭包
函数可以像值一样传递.
示例:
- // 函数闭包
- func testB() func(int) int {
- x := 10
- return func(a int) int {
- return x + a
- }
- }
- // c 就是 testB 返回的方法 c(i) 就是调到 x+a
- func testA() {
- c := testB()
- for i := 0; i < 5; i++ {
- fmt.Println(c(i))
- }
- }
结束语
初识 go 语言系列
[x] 初识 go 语言
[x] 初识 go 语言: 语法
[x] 初识 go 语言: 数据类型
[ ] 初识 go 语言: 方法, 接口及并发
来源: https://www.cnblogs.com/cmyxn/p/9291247.html