首页 > 其他分享 >Go 语言中的数组使用

Go 语言中的数组使用

时间:2024-10-13 15:55:30浏览次数:3  
标签:arr 语言 int fmt Println 数组 Go main

Go 语言中的数组使用

本文将详细介绍 Go 语言中数组的各种用法,包括数组声明和定义、多维数组的使用和遍历,以及数组的值传递等初级、中级和高级用法。

数组声明定义的几种方式

初级用法

介绍

Go 中的数组是一种固定长度、元素类型相同的数据结构,适用于简单的数据存储场景。

应用场景
  • 静态数据集合:用于内存要求严格的嵌入式系统。
  • 基本数值操作:对一组数进行简单计算。
示例代码实现
package main

import "fmt"

func main() {
    // 声明一个未初始化的整型数组
    var arr1 [5]int

    // 使用字面量初始化
    arr2 := [5]int{1, 2, 3, 4, 5}

    // 自动推断长度
    arr3 := [...]int{6, 7, 8, 9, 10}

    fmt.Println("Array 1:", arr1)
    fmt.Println("Array 2:", arr2)
    fmt.Println("Array 3:", arr3)
}

中级用法

介绍

涉及更复杂的初始化或从其他数组复制数据。

应用场景
  • 初始化模式不同的数据集。
  • 从另一个数组复制数据。
示例代码实现
package main

import "fmt"

func main() {
    // 从现有数组创建新数组
    existing := [3]string{"Go", "Python", "Java"}
    copyArr := existing

    fmt.Println("Original Array:", existing)
    fmt.Println("Copied Array:", copyArr)
}

高级用法

介绍

使用自定义函数生成数组或基于条件的动态初始化。

应用场景
  • 创建复杂的初始化逻辑。
  • 通过算法动态生成数组。
示例代码实现
package main

import "fmt"

// 根据条件动态生成数组
func createArray(n int) [5]int {
    var arr [5]int
    for i := 0; i < len(arr); i++ {
        arr[i] = n * (i + 1)
    }
    return arr
}

func main() {
    dynamicArr := createArray(3)
    fmt.Println("Dynamic Array:", dynamicArr)
}

二维数组声明以及数组循环遍历

初级用法

介绍

基础的二维数组声明和遍历,用于表示简单的矩阵。

应用场景
  • 表示固定大小的表格数据。
  • 矩阵计算。
示例代码实现
package main

import "fmt"

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

    for i := 0; i < len(matrix); i++ {
        for j := 0; j < len(matrix[i]); j++ {
            fmt.Printf("%d ", matrix[i][j])
        }
        fmt.Println()
    }
}

中级用法

介绍

支持动态行列数及更复杂初始化。

应用场景
  • 非均匀数据处理。
  • 灵活的表格布局。
示例代码实现
package main

import "fmt"

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

    for _, row := range matrix {
        for _, val := range row {
            fmt.Printf("%d ", val)
        }
        fmt.Println()
    }
}

高级用法

介绍

涉及多种复杂算法应用场景,如图像处理和线性代数。

应用场景
  • 大规模数据计算。
  • 科学计算中的矩阵操作。
示例代码实现
package main

import "fmt"

// 矩阵加法
func addMatrices(a, b [2][2]int) [2][2]int {
    var result [2][2]int
    for i := 0; i < len(a); i++ {
        for j := 0; j < len(a[i]); j++ {
            result[i][j] = a[i][j] + b[i][j]
        }
    }
    return result
}

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

    result := addMatrices(matA, matB)
    fmt.Println("Resultant Matrix:")
    for _, row := range result {
        fmt.Println(row)
    }
}

数组值传递及总结

初级用法

介绍

基本理解数组按值传递特性。

应用场景
  • 数据保护:避免函数修改原始数据。
  • 简单函数调用。
示例代码实现
package main

import "fmt"

func modifyFirstElement(arr [3]int) {
    arr[0] = 99
    fmt.Println("Inside function:", arr)
}

func main() {
    original := [3]int{1, 2, 3}
    fmt.Println("Before function call:", original)

    modifyFirstElement(original)
    fmt.Println("After function call:", original)
}

中级用法

介绍

结合切片使用以增强灵活性。

应用场景
  • 在性能和灵活性之间取得平衡。
  • 复杂数据操作。
示例代码实现
package main

import "fmt"

func modifySlice(slice []int) {
    slice[0] = 99
    fmt.Println("Inside function:", slice)
}

func main() {
    original := [3]int{1, 2, 3}
    modifySlice(original[:])
    fmt.Println("Array after using slice modification:", original)
}

高级用法

介绍

与指针结合使用以直接操控数组内容。

应用场景
  • 高性能需求的直接内存操作。
  • 大型数组的数据交换。
示例代码实现
package main

import "fmt"

func modifyWithPointer(arr *[3]int) {
    arr[0] = 99
    fmt.Println("Inside function with pointer:", arr)
}

func main() {
    original := [3]int{1, 2, 3}
    modifyWithPointer(&original)
    fmt.Println("After pointer function call:", original)
}

测试代码

使用 Go 的 testing 包来测试数组功能。

package main

import (
    "testing"
)

func TestModifyArray(t *testing.T) {
    arr := [3]int{1, 2, 3}
    expected := [3]int{1, 2, 3}

    modifyFirstElement(arr)

    for i, v := range arr {
        if v != expected[i] {
            t.Errorf("Expected %d, got %d", expected[i], v)
        }
    }
}

func TestModifyWithPointer(t *testing.T) {
    arr := [3]int{1, 2, 3}
    expected := [3]int{99, 2, 3}

    modifyWithPointer(&arr)

    for i, v := range arr {
        if v != expected[i] {
            t.Errorf("Expected %d, got %d", expected[i], v)
        }
    }
}

部署场景

  • 嵌入式系统或者实时系统中,因为其需要高效的内存使用和快速的访问时间。
  • 高性能计算中使用指针来优化大型数组的操作。

材料链接

总结

掌握数组在 Go 中的使用,可以帮助开发者编写高效、可靠的程序。通过结合切片和指针,可以在性能和灵活性上达到良好平衡。在一些高级应用场景下,了解这些底层特性可以显著提升应用的效率。

未来展望

随着硬件的发展和软件复杂性的增加,新的编程范式和工具可能会出现,以更加智能化的方式处理数据结构。这能够帮助开发者在不牺牲效率的情况下,编写出高度可维护和可扩展的代码。

标签:arr,语言,int,fmt,Println,数组,Go,main
From: https://blog.csdn.net/feng1790291543/article/details/142753048

相关文章

  • golang从http请求中读取xml格式的body,并转成json
    推荐学习文档golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔记专栏文章目录以下是在Go语言中从HTT......
  • DAY31 ||贪心算法基础 | 455.分发饼干 |376.摆动序列 |53.最大子数组和
    贪心算法基础贪心算法是一种在求解问题时采取逐步构建解决方案的算法策略。它通过在每一步选择在当前看来最优的选择(即“贪心”选择),希望通过局部最优解的累积得到全局最优解。贪心算法的核心思想局部最优:每一步都选择在当前状态下最优的选择,不考虑后续步骤可能带来的影响。......
  • 实验2 C语言分支与循环基础应用编程
    #include<stdio.h>#include<stdlib.h>#include<time.h>#defineN5#defineN1397#defineN2476#defineN321intmain(){intcnt;intrandom_major,random_no;srand(time(NULL));//以当前系统时间作为随机种子cnt=0;wh......
  • 02 线性结构——数组(特性、优缺点、基本使用、可变长的动态数组)
    目录1数组基础知识1.1认识数组1.2数组的声明1.3 数组的特性2数组的优缺点2.1优点2.1.1查找容易2.1.2高效的访问和修改2.2缺点2.2.1插入和删除效率低2.2.2扩展相对繁琐3数组的基本使用3.1遍历数组3.2修改数组元素4可变长的动态数组4.1 实现原理......
  • 实验2 c语言分支与循环基础应用编程-1
    实验任务1task1.c1#include<stdio.h>2#include<stdlib.h>3#include<time.h>45#defineN56#defineN13977#defineN24768#defineN321910intmain(){11intcnt;12intrandom_major,random_no;1314s......
  • 实验2 c语言分支与循环基础应用编程1
    task1:问题1随机数求余后结果为1,生成0397到0476中的随机数问题2随机数求余后结果为0,生成0001到0021中的随机数问题3随机生成5个不同的学号task2: 实验3: task4:1#include<stdio.h>2intmain()3{4doublex,sum,max,min;5sum=0;6......
  • 分享我的Nvim Go语言配置文件
    细节参考我的另一篇文章(C++那篇)需要配置好Go语言的环境变量(可参考https://learnku.com/articles/24924)callplug#begin('~/.config/nvim/plugged')Plug'preservim/nerdtree'Plug'majutsushi/tagbar'Plug'Xuyuanp/nerdtree-git-plugin'Plug'......
  • 【开题报告】基于django+vue快递仓库管理系统(论文+源码)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着电子商务的蓬勃发展和物流行业的快速增长,快递仓库的管理变得日益复杂和关键。传统的仓库管理方式已经难以满足当前高效、精准的管理需......
  • 【C语言】爱心代码与EasyX的安装
    前几天学习了C语言上爱心代码:1.静态的#include<stdio.h>#include<stdlib.h>#include<windows.h>intmain(intargc,char*argv[]){ floatx,y,a; for(y=1.5;y>-1.5;y-=0.1){ for(x=-1.5;x<1.5;x+=0.05){ a=x*x+y*y-1; putchar(a*a*a-x*x*y*......
  • Spring Boot知识管理:多语言支持与国际化
    摘要随着信息互联网信息的飞速发展,无纸化作业变成了一种趋势,针对这个问题开发一个专门适应师生作业交流形式的网站。本文介绍了知识管理系统的开发全过程。通过分析企业对于知识管理系统的需求,创建了一个计算机管理知识管理系统的方案。文章介绍了知识管理系统的系统分析部......