• 技术文章 >后端开发 >Golang

    go语言中元组是什么

    青灯夜游青灯夜游2022-12-27 11:27:27原创781

    元组是固定长度不可变的顺序容器(元素序列),go语言中没有元组类型,数组就相当于元组。在go语言中,数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成;数组的声明语法为“var 数组变量名 [元素数量]Type”。

    本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。

    什么是元组

    元组(tuple):固定长度不可变的顺序容器,访问效率高,适合存储一些长常量数据。

    简单的理解就是将一堆数据存放到一个容器中,但这个容器有一个特点,就是很固执,一旦定义了之后就不可改变,从某种意义上来说元组就是不可以改变的列表,功能和列表类似,同样可以进行切片、修改等操作。

    go语言中没有元组类型

    go语言中的数组相当于python中的元组。

    数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。

    Go语言中的数组

    数组的声明

    数组的声明语法如下:

    var 数组变量名 [元素数量]Type

    语法说明如下所示:

    在 Go 语言中 , 要创建数组, 可声明一个数组变量,并指定其长度和数据类型。

    只包含两个元素,无法给第 3 个元素赋值,因此这将导致编 译阶段错误。

    var cheeses [2]string
    cheeses[O] = "Mar iolles”
    cheeses[l] = ” Epoisses de Bourgogne ”

    数组的每个元素都可以通过索引下标来访问,索引下标的范围是从 0 开始到数组长度减 1 的位置,内置函数 len() 可以返回数组中元素的个数。

    var a [3]int             // 定义三个整数的数组
    fmt.Println(a[0])        // 打印第一个元素
    fmt.Println(a[len(a)-1]) // 打印最后一个元素
    // 打印索引和元素
    for i, v := range a {
        fmt.Printf("%d %d\n", i, v)
    }
    // 仅打印元素
    for _, v := range a {
        fmt.Printf("%d\n", v)
    }

    默认情况下,数组的每个元素都会被初始化为元素类型对应的零值,对于数字类型来说就是 0,同时也可以使用数组字面值语法,用一组值来初始化数组:

    var q [3]int = [3]int{1, 2, 3}
    var r [3]int = [3]int{1, 2}
    fmt.Println(r[2]) // "0"

    在数组的定义中,如果在数组长度的位置出现“...”省略号,则表示数组的长度是根据初始化值的个数来计算,因此,上面数组 q 的定义可以简化为:

    q := [...]int{1, 2, 3}
    fmt.Printf("%T\n", q) // "[3]int"

    数组的长度是数组类型的一个组成部分,因此 [3]int 和 [4]int 是两种不同的数组类型,数组的长度必须是常量表达式,因为数组的长度需要在编译阶段确定。

    q := [3]int{1, 2, 3}
    q = [4]int{1, 2, 3, 4} // 编译错误:无法将 [4]int 赋给 [3]int

    比较两个数组是否相等

    如果两个数组类型相同(包括数组的长度,数组中元素的类型)的情况下,我们可以直接通过较运算符(==和!=)来判断两个数组是否相等,只有当两个数组的所有元素都是相等的时候数组才是相等的,不能比较两个类型不同的数组,否则程序将无法完成编译。

    a := [2]int{1, 2}
    b := [...]int{1, 2}
    c := [2]int{1, 3}
    fmt.Println(a == b, a == c, b == c) // "true false false"
    d := [3]int{1, 2}
    fmt.Println(a == d) // 编译错误:无法比较 [2]int == [3]int

    遍历数组——访问每一个数组元素

    遍历数组也和遍历切片类似,代码如下所示:

    var team [3]string
    team[0] = "hammer"
    team[1] = "soldier"
    team[2] = "mum"
    for k, v := range team {
        fmt.Println(k, v)
    }

    代码输出结果:

    1.png

    代码说明如下:

    Golang中实现tuple(元组)功能

    虽然其他语言有tuple类型,但go语言却没有提供。但无需失望,go的其他特性可以非常容易实现tuple功能。下面通过示例来演示Go如何实现tuple类型功能。

    使用struct

    tuple可以存储不同数据类型,我们可以使用interface{}类型支持任意数据类型。

    package main
    
    import "fmt"
    
    func main() {
    	type Student struct {
    		name, age interface{}
    	}
    
    	stuList1 := []Student{
    		{"tom", 21},
    		{"jack", 22},
    	}
    
    	stuList2 := []Student{
    		{"mary", 30},
    	}
    	// append stuList2 to stuList1
    	stuList1 = append(stuList1, stuList2...)
    
    	for _, stu := range stuList1 {
    		fmt.Println(“stuInfo:”,stu)
    	}
    }
    
    
    /*
    Output:
    stuInfo: {tom 21}
    stuInfo: {jack 22}
    stuInfo: {mary 30}
    */

    通过输出可以看到结果为类似于tuple类型,并且还可以通过点号访问单个属性。虽然这些特性都于tuple相关,但实际上它不是tuple类型。

    返回多个值

    通过tuple 函数可以返回多个值。虽然go没有tuple类型,但支持返回函数返回多个值:

    package main
    
    import "fmt"
    
    func multipleValues() (string, int) {
    	return "Alex", 21
    }
    
    func main() {
    	name, age := multipleValues()
    	fmt.Println("Name :", name)
    	fmt.Println("Age :", age)
    }
    
    /*
    Output:
    Name : Alex
    Age : 21
    */

    这里可以看到一次返回多个值。

    【相关推荐:Go视频教程编程教学

    以上就是go语言中元组是什么的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:go语言 Golang 数组
    上一篇:go语言能做后端吗 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • golang接口怎么实现• golang怎么进行错误处理• golang简洁吗• go语言同步机制有哪些• go语言中跳转语句有哪些
    1/1

    PHP中文网