Go语言学习之数组的用法详解

Go语言学习之数组的用法详解

什么是数组

数组是一种由相同类型元素组成的集合类型。数组在Go语言中是值类型,在使用数组时,操作的是数组的副本而不是本身。

数组的声明和初始化

在Go语言中,数组的声明和初始化可以有多中方式。

声明并初始化

var arr1 [5]int                  // 声明一个长度为5的int类型的数组
var arr2 = [5]int{1, 2, 3, 4, 5} // 声明并初始化一个长度为5的int类型的数组

使用...进行长度推断

arr3 := [...]int{1, 2, 3, 4, 5}   // 声明并初始化一个长度为5的int类型的数组

使用索引进行初始化

arr4 := [5]int{3: 1, 4: 2}        // 声明并初始化一个长度为5的int类型的数组,使用索引进行初始化

多维数组的声明和初始化

var arr5 [5][5]int               // 声明一个5x5的int类型的二维数组
var arr6 = [2][2]int{{1, 2}, {3, 4}} // 声明并初始化一个2x2的int类型的二维数组

数组的访问和遍历

数组的元素可以通过索引进行访问。可以使用for循环语句对数组进行遍历。

var arr = [5]int{1, 2, 3, 4, 5}

for i := 0; i < len(arr); i++ {
    fmt.Printf("arr[%d] = %d\n", i, arr[i])
}

for i, v := range arr {
    fmt.Printf("arr[%d] = %d\n", i, v)
}

可以看到,在遍历数组时,使用了语法糖rangei表示数组的下标,v表示数组的元素值。

数组作为函数参数

由于数组是值类型,所以在函数调用时会拷贝整个数组。因此使用指针可以避免这种拷贝,提高性能。

func sum(arr [5]int) int {
    sum := 0

    for _, v := range arr {
        sum += v
    }

    return sum
}

func sumByPointer(arr *[5]int) int {
    sum := 0

    for _, v := range arr {
        sum += v
    }

    return sum
}

func main() {
    arr1 := [5]int{1, 2, 3, 4, 5}
    arr2 := &arr1

    fmt.Println(sum(arr1))
    fmt.Println(sumByPointer(arr2))
}

可以看到,在函数sum中传递了数组的副本,而函数sumByPointer传递了指向数组的指针。

示例

示例1:找出数组中的最大值

对于一个长度为n的数组,可以定义一个变量max,初始值为数组的第一个元素,然后遍历整个数组,如果数组的元素比max大,就将max赋值为这个元素,最终max即为数组中的最大值。

func findMax(arr [5]int) int {
    max := arr[0]

    for _, v := range arr {
        if v > max {
            max = v
        }
    }

    return max
}

func main() {
    arr := [5]int{1, 3, 5, 2, 4}

    fmt.Println(findMax(arr))
}

输出:

5

示例2:矩阵转置

给定一个二维数组,将它转置。

func transpose(matrix [3][3]int) [3][3]int {
    var res [3][3]int

    for i := 0; i < 3; i++ {
        for j := 0; j < 3; j++ {
            res[i][j] = matrix[j][i]
        }
    }

    return res
}

func main() {
    matrix := [3][3]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}

    fmt.Println("origin matrix:")
    for _, row := range matrix {
        fmt.Println(row)
    }

    res := transpose(matrix)

    fmt.Println("transpose matrix:")
    for _, row := range res {
        fmt.Println(row)
    }
}

输出:

origin matrix:
[1 2 3]
[4 5 6]
[7 8 9]
transpose matrix:
[1 4 7]
[2 5 8]
[3 6 9]

以上就是Go语言学习之数组的用法详解,希望能对你的学习有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go语言学习之数组的用法详解 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • Hive(四):c#通过odbc访问hive

    Hive(四): C# 通过 ODBC 访问 Hive Hive 是一个流行的开源数据仓库,它为用户提供一个 SQL-like 的接口来查询和操作大规模数据集。然而,Hive 对于 C# 开发者并不是很友好,因为它没有为 Windows 平台提供方便的开发接口,同时也没有官方的 .NET 客户端。 不过,我们可以通过 ODBC(开放式数据库连接)方式来访问 …

    其他 2023年3月28日
    00
  • Python中全局变量和局部变量的理解与区别

    Python中全局变量和局部变量的理解与区别 在Python中,全局变量和局部变量是两种不同的变量类型,它们在作用域和访问权限上有所不同。理解和区分这两种变量类型对于编写清晰、可维护的代码非常重要。 全局变量 全局变量是在整个程序中都可以访问的变量,它可以在任何函数内部进行访问和修改。在Python中,全局变量通常在函数外部定义,并且在函数内部使用globa…

    other 2023年7月28日
    00
  • Flutter 网络请求框架封装详解

    Flutter 网络请求框架封装详解 网络请求是移动应用中常用的功能,Flutter提供了丰富的网络请求支持和第三方库,如http、dio等。为了简化开发流程,最好将网络请求进行封装。 封装思路 封装网络请求的主要思路是将网络请求的参数进行封装,提高代码复用率和可读性。一般封装网络请求都会包含以下几个步骤: 封装请求参数和请求路径 封装请求头 封装请求体 封…

    other 2023年6月25日
    00
  • Win10快速预览版19608.1006怎么手动更新升级?

    首先,我们需要明确Win10快速预览版是Microsoft建立的一种试验版操作系统。因此,我们在手动更新升级时需要对待其谨慎,以免出现意外情况。以下是Win10快速预览版19608.1006手动更新升级的步骤: 步骤1:备份重要数据 在进行Win10快速预览版19608.1006的手动更新升级之前,我们应该及时备份重要的数据,以免出现意外情况导致数据丢失。备…

    other 2023年6月27日
    00
  • ios本地通知

    当然,我可以为您提供有关“iOS本地通知”的完整攻略,以下是详细说明: 什么是iOS本地通知? iOS本地通知是一种在iOS设备上发送通知的方式,它可以在应用程序未运行时向用户发送通知。本地通知可以用于提醒用户执行某些操作,如提醒用户完成任务、提醒用户查看新消息等。 iOS本地通知的实现步骤 以下是实现iOS本地通知的详细步骤: 导入UserNotifica…

    other 2023年5月7日
    00
  • mybatis原理第四篇——statementhandler对象

    以下是关于“MyBatis原理第四篇——StatementHandler对象”的完整攻略,包括StatementHandler对象的基本概念、使用方法和两个示例。 StatementHandler对象的基本概念 在MyBatis中,StatementHandler对象是执行SQL语句的核心对象之一。它负责创建和执行PreparedStatement对象,并将…

    other 2023年5月7日
    00
  • JavaScript作用域链使用介绍

    JavaScript作用域链使用介绍 JavaScript中的作用域链是一种用于查找变量和函数的机制。当访问一个变量或函数时,JavaScript引擎会按照作用域链的顺序逐级查找,直到找到对应的标识符或者到达全局作用域。 作用域链的构成 作用域链由多个执行上下文(execution context)组成,每个执行上下文都有一个关联的变量对象(variable…

    other 2023年8月19日
    00
  • java获取两个日期之间的所有日期(年月日)

    当然,我很乐意为您提供有关“Java获取两个日期之间的所有日期(年月日)”的完整攻略。以下是详细的步骤和两个示例: 1 获取两个日期之间的所有日期 要获取两个日期之间的所有日期,可以使用Java中的Calendar类和SimpleDateFormat类。以下是获取两个日期之间的所有日期的步骤: 创建两个日期对象,表示要获取的日期范围。 使用Calendar类…

    other 2023年5月6日
    00
合作推广
合作推广
分享本页
返回顶部