go语言第四章(数组和切片)

简介: go语言第四章(数组和切片)

go语言第四章(数组和切片)

首先没有编译器的可以通过这个网址进行敲代码:Lightly

简介

在 Go 语言中,数组是一种固定长度的数据结构,用于存储一组相同类型的元素。数组的长度在创建时就已经确定,不可变更。

数组

数组的声明和初始化

在 Go 语言中,可以使用 var 关键字和数组类型来声明一个数组,然后使用 {} 来初始化该数组的值。例如:

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

上述代码定义了一个长度为 5 的整型数组,并将其初始化为 {1, 2, 3, 4, 5}。

也可以使用以下简化的方式来声明和初始化数组

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

这个代码示例与上述代码示例的效果是相同的,只是使用了短变量声明语法来声明并初始化数组。

如果想要让编译器自动计算数组长度,则可以使用 … 代替具体的长度数值,例如:

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

上述代码会自动计算数组的长度为 5。

数组的访问和遍历

在 Go 语言中,可以使用下标来访问数组中的元素。数组的下标从 0 开始并逐个递增,最大值为数组长度减 1。例如:

arr := [5]int{1, 2, 3, 4, 5}
fmt.Println(arr[0]) // 输出 1
fmt.Println(arr[4]) // 输出 5

可以使用 for 循环来遍历数组中的所有元素。例如:

arr := [5]int{1, 2, 3, 4, 5}
for i := 0; i < len(arr); i++ {
    fmt.Println(arr[i])
}

也可以使用 range 关键字来遍历数组,range 表达式返回数组的索引和对应的值。例如:

arr := [5]int{1, 2, 3, 4, 5}
for index, value := range arr {
    fmt.Printf("索引:%d,值:%d\n", index, value)
}

以上就是 Go 语言中数组的基本使用方法。需要注意的是,在编写代码时,要确保下标不越界,并注意数组长度和数据类型的匹配。

例题

1. 计算并输出给定数组中所有元素的和
package main
import "fmt"
func main() {
    arr := [5]int{1, 2, 3, 4, 5}
    sum := 0
    for i := 0; i < len(arr); i++ {
        sum += arr[i]
    }
    fmt.Printf("数组 %v 的元素之和为 %d\n", arr, sum)
}

运行结果:

2. 在给定数组中查找指定的元素,并输出该元素的下标
package main
import "fmt"
func main() {
    arr := [5]int{1, 2, 3, 4, 5}
    target := 3
    index := -1
    for i := 0; i < len(arr); i++ {
        if arr[i] == target {
            index = i
            break
        }
    }
    if index >= 0 {
        fmt.Printf("元素 %d 在数组 %v 中的下标为 %d\n", target, arr, index)
    } else {
        fmt.Printf("元素 %d 不在数组 %v 中\n", target, arr)
    }
}

运行结果:

3. 将给定数组中的元素倒序排列并输出结果
package main
import "fmt"
func main() {
    arr := [5]int{1, 2, 3, 4, 5}
    for i := 0; i < len(arr)/2; i++ {
        j := len(arr) - i - 1
        arr[i], arr[j] = arr[j], arr[i]
    }
    fmt.Println("数组倒序后为:", arr)
}

运行结果:

切片

简介

切片是一种动态长度的数据结构,可以根据需要自动扩展或缩小。在 Go 语言中,可以使用 []T 表示一个元素类型为 T 的切片,并使用 make 函数来创建一个指定长度和容量的空切片。例如:

var slice []int
slice = make([]int, 5)

上述代码定义了一个长度和容量均为 5 的整型切片。如果只指定长度而不指定容量,则切片的容量与长度相同。可以使用下标来访问切片中的元素,例如:

fmt.Println(slice[0]) // 输出 0
fmt.Println(slice[4]) // 输出 0

同时,也可以使用 for 循环或者 range 关键字来遍历切片中的所有元素。

需要注意的是,如果将一个数组的部分元素赋值给一个切片,则该切片会引用原始数组的一部分元素。如果修改切片中的元素,则原始数组中对应的元素也会被修改。例如:

arr := [5]int{1, 2, 3, 4, 5}
slice := arr[1:4]
slice[0] = 10
fmt.Println(arr)   // 输出 [1 10 3 4 5]
fmt.Println(slice) // 输出 [10 3 4]

以上就是 Go 语言中数组和切片的基本概念。需要注意的是,在使用数组和切片时,要确保下标不越界,并注意数组长度和数据类型的匹配。

例题

1. 编写一个函数,计算给定整型数组中所有元素的平均值。
package main
import "fmt"
func average(arr [5]int) float64 {
    sum := 0
    for i := 0; i < len(arr); i++ {
        sum += arr[i]
    }
    return float64(sum) / float64(len(arr))
}
func main() {
    arr := [5]int{1, 2, 3, 4, 5}
    fmt.Printf("数组 %v 的平均值为 %.2f\n", arr, average(arr))
}

运行结果:

2. 编写一个函数,将给定整型切片中的所有元素相加并返回结果。
package main
import "fmt"
func sum(slice []int) int {
    result := 0
    for i := 0; i < len(slice); i++ {
        result += slice[i]
    }
    return result
}
func main() {
    slice := []int{1, 2, 3, 4, 5}
    fmt.Printf("切片 %v 中所有元素的和为 %d\n", slice, sum(slice))
}

运行结果:

3. 编写一个函数,将给定整型切片中的所有奇数元素替换为其平方值,并输出修改后的结果。
package main
import "fmt"
func squareOdd(slice []int) {
    for i := 0; i < len(slice); i++ {
        if slice[i]%2 == 1 {
            slice[i] *= slice[i]
        }
    }
}
func main() {
    slice := []int{1, 2, 3, 4, 5}
    fmt.Println("修改前:", slice)
    squareOdd(slice)
    fmt.Println("修改后:", slice)
}

运行结果:

相关文章
|
3天前
|
人工智能 Go 调度
掌握Go并发:Go语言并发编程深度解析
掌握Go并发:Go语言并发编程深度解析
|
19天前
|
Go
go语言中的数据类型
go语言中的数据类型
13 0
|
24天前
|
Go 开发者
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
|
24天前
|
安全 Go
掌握Go语言:Go语言通道,并发编程的利器与应用实例(20)
掌握Go语言:Go语言通道,并发编程的利器与应用实例(20)
|
24天前
|
存储 缓存 安全
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
|
6天前
|
数据采集 存储 Go
使用Go语言和chromedp库下载Instagram图片:简易指南
Go语言爬虫示例使用chromedp库下载Instagram图片,关键步骤包括设置代理IP、创建带代理的浏览器上下文及执行任务,如导航至用户页面、截图并存储图片。代码中新增`analyzeAndStoreImage`函数对图片进行分析和分类后存储。注意Instagram的反爬策略可能需要代码适时调整。
使用Go语言和chromedp库下载Instagram图片:简易指南
|
24天前
|
存储 安全 Go
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
|
2天前
|
Go 开发者
Golang深入浅出之-Go语言上下文(context)包:处理取消与超时
【4月更文挑战第23天】Go语言的`context`包提供`Context`接口用于处理任务取消、超时和截止日期。通过传递`Context`对象,开发者能轻松实现复杂控制流。本文解析`context`包特性,讨论常见问题和解决方案,并给出代码示例。关键点包括:1) 确保将`Context`传递给所有相关任务;2) 根据需求选择适当的`Context`创建函数;3) 定期检查`Done()`通道以响应取消请求。正确使用`context`包能提升Go程序的控制流管理效率。
7 1
|
2天前
|
安全 Go 开发者
Golang深入浅出之-Go语言并发编程面试:Goroutine简介与创建
【4月更文挑战第22天】Go语言的Goroutine是其并发模型的核心,是一种轻量级线程,能低成本创建和销毁,支持并发和并行执行。创建Goroutine使用`go`关键字,如`go sayHello(&quot;Alice&quot;)`。常见问题包括忘记使用`go`关键字、不正确处理通道同步和关闭、以及Goroutine泄漏。解决方法包括确保使用`go`启动函数、在发送完数据后关闭通道、设置Goroutine退出条件。理解并掌握这些能帮助开发者编写高效、安全的并发程序。
13 1
|
3天前
|
SQL 关系型数据库 MySQL
Golang数据库编程详解 | 深入浅出Go语言原生数据库编程
Golang数据库编程详解 | 深入浅出Go语言原生数据库编程