9.6 Go语言入门(数组、切片和指针)

目录

Go 语言(Golang)是一种静态类型、编译型语言,由 Google 开发,专注于简洁性、并发和高效性。

下面是 Go 语言的基础语法讲解和代码示例。


上一篇:四、Go语言入门(条件语句和循环语句)


五、数组、切片和指针

在 Go 语言中,数组、切片和指针是非常重要的数据结构和概念。它们各自有不同的用途和特性,理解它们有助于编写高效和清晰的代码。下面详细讲解 Go 语言中的数组、切片和指针,并提供代码示例。

1. 数组

数组是固定长度的同类型元素的集合。数组的长度在声明时就确定了,之后不能改变。

1.1 声明和初始化数组
package main

import "fmt"

func main() {
    // 声明一个长度为 5 的整型数组,并初始化
    var arr1 [5]int
    fmt.Println(arr1) // 输出:[0 0 0 0 0]

    // 使用字面量初始化数组
    arr2 := [5]int{1, 2, 3, 4, 5}
    fmt.Println(arr2) // 输出:[1 2 3 4 5]

    // 部分初始化,未指定的元素使用默认值
    arr3 := [5]int{1, 2}
    fmt.Println(arr3) // 输出:[1 2 0 0 0]

    // 使用 ... 推断数组长度
    arr4 := [...]int{1, 2, 3}
    fmt.Println(arr4) // 输出:[1 2 3]
}

1.2 访问和修改数组元素
package main

import "fmt"

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

    // 访问数组元素
    fmt.Println(arr[0]) // 输出:1

    // 修改数组元素
    arr[0] = 10
    fmt.Println(arr) // 输出:[10 2 3 4 5]
}

1.3 多维数组
package main

import "fmt"

func main() {
    // 声明一个 2x3 的二维数组
    var matrix [2][3]int
    fmt.Println(matrix) // 输出:[[0 0 0] [0 0 0]]

    // 初始化二维数组
    matrix = [2][3]int{{1, 2, 3}, {4, 5, 6}}
    fmt.Println(matrix) // 输出:[[1 2 3] [4 5 6]]
}

2. 切片

切片是一个动态数组,可以根据需要自动扩展。切片比数组更灵活,更常用。

2.1 声明和初始化切片
package main

import "fmt"

func main() {
    // 声明一个长度为 3 的整型切片,并初始化
    var s1 []int
    fmt.Println(s1) // 输出:[]

    // 使用字面量初始化切片
    s2 := []int{1, 2, 3, 4, 5}
    fmt.Println(s2) // 输出:[1 2 3 4 5]

    // 使用 make 函数创建切片
    s3 := make([]int, 5) // 创建长度为 5 的切片,元素初始值为 0
    fmt.Println(s3) // 输出:[0 0 0 0 0]

    // 创建一个长度为 3,容量为 5 的切片
    s4 := make([]int, 3, 5)
    fmt.Println(s4) // 输出:[0 0 0]
}

2.2 访问和修改切片元素
package main

import "fmt"

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

    // 访问切片元素
    fmt.Println(s[0]) // 输出:1

    // 修改切片元素
    s[0] = 10
    fmt.Println(s) // 输出:[10 2 3 4 5]
}

2.3 切片操作

切片支持切片操作符,允许从现有切片中创建新的切片。

package main

import "fmt"

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

    // 从索引 1 到索引 3 创建一个新的切片(不包括索引 3)
    s1 := s[1:3]
    fmt.Println(s1) // 输出:[2 3]

    // 省略开始索引表示从头开始
    s2 := s[:3]
    fmt.Println(s2) // 输出:[1 2 3]

    // 省略结束索引表示直到最后
    s3 := s[2:]
    fmt.Println(s3) // 输出:[3 4 5]

    // 完全省略表示整个切片
    s4 := s[:]
    fmt.Println(s4) // 输出:[1 2 3 4 5]
}

2.4 切片的追加和拷贝

使用 append 函数可以向切片中追加元素,使用 copy 函数可以拷贝切片。

package main

import "fmt"

func main() {
    s := []int{1, 2, 3}

    // 追加单个元素
    s = append(s, 4)
    fmt.Println(s) // 输出:[1 2 3 4]

    // 追加多个元素
    s = append(s, 5, 6, 7)
    fmt.Println(s) // 输出:[1 2 3 4 5 6 7]

    // 追加一个切片
    s2 := []int{8, 9}
    s = append(s, s2...)
    fmt.Println(s) // 输出:[1 2 3 4 5 6 7 8 9]

    // 拷贝切片
    s3 := make([]int, len(s))
    copy(s3, s)
    fmt.Println(s3) // 输出:[1 2 3 4 5 6 7 8 9]
}

3. 指针

指针是存储另一个变量的内存地址的变量。在 Go 中,指针可以用来传递大对象以避免拷贝,提高性能。

3.1 声明和初始化指针
package main

import "fmt"

func main() {
    var a int = 10

    // 声明一个指向 int 的指针
    var p *int

    // 将 a 的地址赋值给 p
    p = &a

    // 访问指针变量的值
    fmt.Println("Address of a:", p) // 输出:a 的地址
    fmt.Println("Value of *p:", *p) // 输出:10

    // 修改指针指向的值
    *p = 20
    fmt.Println("New value of a:", a) // 输出:20
}

3.2 指针与函数

指针可以作为函数参数,用于传递大对象以避免拷贝。

package main

import "fmt"

// 函数参数是一个指向 int 的指针
func updateValue(p *int) {
    *p = 200
}

func main() {
    a := 100
    fmt.Println("Before:", a) // 输出:100

    // 将 a 的地址传递给函数
    updateValue(&a)

    fmt.Println("After:", a) // 输出:200
}

3.3 指针数组和数组指针

指针数组是包含指针的数组,数组指针是指向数组的指针。

package main

import "fmt"

func main() {
    // 指针数组
    arr1 := [3]*int{}
    a, b, c := 1, 2, 3
    arr1[0] = &a
    arr1[1] = &b
    arr1[2] = &c

    for i, p := range arr1 {
        fmt.Println(i, *p) // 输出:0 1, 1 2, 2 3
    }

    // 数组指针
    arr2 := [3]int{1, 2, 3}
    var p *[3]int = &arr2

    fmt.Println(p)        // 输出:&[1 2 3]
    fmt.Println(*p)       // 输出:[1 2 3]
    fmt.Println((*p)[1])  // 输出:2
}

通过理解数组、切片和指针,能够更好地处理复杂的数据结构和内存管理,提高程序的效率和性能。


下一篇:六、Go语言入门(映射 Map)


在这里插入图片描述

  • 23
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
c测试9.6是指在编程中使用C语言进行的一项测试或考试,一般涉及C语言的基本语法、数据类型、函数、指针等方面的知识。C语言是一种高效、灵活且广泛应用于系统编程和嵌入式开发的计算机编程语言,因此对于程序员来说,掌握C语言是非常重要的。 在c测试9.6中,可能会涉及一些常见的编程题,例如求解斐波那契数列、冒泡排序、计算阶乘等等。这些问题常被用来测试程序员对C语言基本语法、逻辑思维和编程能力的掌握程度。 参加c测试9.6的人通常是希望通过测试来检验自己对C语言的熟练程度,或者是为了进一步提升自己的编程技能而参加的考试。无论是准备应聘工作还是提升个人能力,掌握C语言都是一个很好的选择。 为了在c测试9.6中取得好的成绩,考生需要充分准备。首先,需要复习C语言的基本语法和常用的函数库,掌握C语言的数据类型、控制结构以及数组指针的使用方法。其次,需要进行大量的编程练习,熟悉常见的编程问题,并学会运用C语言进行解决。最后,在测试前需要进行自我测试和模拟演练,以熟悉考试的形式和流程,以便在考试中更加从容应对。 总之,c测试9.6是一项考察对C语言掌握程度的考试,对于想要从事程序开发的人来说是一次检验自己编程能力的机会。通过充分的准备和努力,相信每个参加c测试9.6的人都可以取得不错的成绩。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ibun.song

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值