• 7 天学个Go,Go 结构体 + Go range 来学学


    写在学习前

    在前一篇博客我们学习了 Go 数组,其要求所有元素为同一数据类型,如果希望存储不同类型的数据,就要用到结构体相关知识。

    结构体的定义:存储相同或不同类型的数据集合。

    有 C 相关经验,结构体还是比较容易理解的,语法格式如下所示:

    type struct_variable_type struct {
       member definition
       member definition
       ...
       member definition
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    上述语法格式的关键字是 structtypestruct_variable_type 是结构体名称,例如我们声明一个【人】的结构体,有姓名,有年龄,有性别。

    package main
    
    import "fmt"
    
    // 声明结构体
    type People struct {
    	name string
    	age  int
    	sex  int
    }
    
    func main() {
    	//使用结构体
    	people := People{
    		"橡皮擦",
    		18,
    		0}
    	fmt.Println(people)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在编写的时候要注意语法格式,其中结构体的使用代码建议放在一行,或者右大括号紧跟最后一个元素。

    使用结构体也可以携带元素名,即下述写法。

    //使用结构体
    people := People{name: "橡皮擦", age: 18, sex: 0}
    fmt.Println(people)
    
    • 1
    • 2
    • 3

    访问结构体成员
    使用 结构体.成员名 即可,当然也可以用该办法进行赋值。

    //使用结构体
    var people1 People
    // var people2 People
    
    people1.name = "橡皮擦"
    people1.age = 18
    people1.sex = 1
    
    fmt.Println(people1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Go Range

    作为一个 Python 程序员,关键字 range 是非常熟悉的,在 Go 中 range 关键字可以用于 for 循环,用于数组它返回元素的索引和值,在后续学习的集合中返回键值对。

    range 用于数组的语法格式如下所示:

    for i,value := range a_array{
    	// TODO
    }
    
    • 1
    • 2
    • 3

    结合语法格式,编写下述代码:

    package main
    
    import "fmt"
    
    var a_array = []int{1, 2, 3, 4, 5, 6, 7, 8}
    
    func main() {
    	for i, value := range a_array {
    		fmt.Printf("索引:%d,值:%d\n", i, value)
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行代码输出如下信息:

    索引:0,值:1
    索引:1,值:2
    索引:2,值:3
    索引:3,值:4
    索引:4,值:5
    索引:5,值:6
    索引:6,值:7
    索引:7,值:8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    如果将 range 作用于字符串,可以对其每个字符进行迭代输出。

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	var str string = "xiangpica"
    	for k, v := range str {
    		fmt.Println(k, string(v))
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    上述 str 中的内容为纯英文,k 值每次+1。

    0 x
    1 i
    2 a
    3 n
    4 g
    5 p
    6 i
    7 c
    8 a
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    如果 str 中包含中文,k 值每次 +3,代码如下:

    func main() {
    	var str string = "橡皮擦"
    	for k, v := range str {
    		fmt.Println(k, string(v))
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出结果如下:

    036
    • 1
    • 2
    • 3

    如果是中英文混拼,出现的结果会更加有趣。

    0 x
    1 i
    2 a
    3 n
    4 g
    58 p
    9 i
    1013 c
    14 a
    15
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这里其实可以得到一个结论,range 迭代是的 Unicode,而不是字节,返回值是 UTF-8 编码第 1 个字节的索引,所以索引值有可能并不连续。

    在编写代码的时候,如果不需要索引,只保留元素,可以使用废弃占位符,代码如下:

    var str string = "xiang橡pi皮ca擦"
    for _, v := range str {
    	fmt.Println(string(v))
    }
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    机器学习06|两万字:决策树 【jupyter代码详解篇】
    ifream标签中的子页面,操作父页面的元素
    【图像分割】基于布谷鸟算法实现二维Tsallis熵、kapur、oust多阈值图像分割附matlab代码
    记LGSVL Map Annotation(1) LGSVL本地编译记录、安装
    数据仓库建模设计
    算法 反转自符串-(双指针)
    `Executor` 接口
    1.3. DIGITAL SIGNATURES数字签名
    SpringBoot 3.x 结合 Swagger3 (Knife4j )踩坑实录
    实时数仓中的分层
  • 原文地址:https://blog.csdn.net/hihell/article/details/126009491