浅析Go语言中数组的这些细节

目录
  • Go语言基础二
    • len&cap
    • 二维数组的遍历
    • 数组的拷贝与传参
    • 求数组所有元素之和
    • 例题:数组元素匹配问题
  • 今日总结

Go语言基础二

len&cap

书接上文,我们提到二维数组中的第二个维度的数组不能用...来表示,接下来我们要认识两个新的函数,它们分别是lencap

package main
​
func main() {
    a := [2]int{}
    println(len(a), cap(a))
}

由上方代码可知,我们在main函数里面定义了一个a数组长度为2未进行初始化变量等赋值操作,所以数组元素均为0;调用打印函数输出的是数组a的lengthcap值,这里运行结果均为2

二维数组的遍历

接下来我们重点讲一下二维数组的遍历,有些小伙伴可能就要问了:我没学过什么遍历循环啊,这让我怎么理解?

别急,咱们看代码主要看的是一个思路过程~

package main
import (
    "fmt"
)
func main() {
    var f [2][3]int = [...][3]int{{1, 2, 3}, {7, 8, 9}}
    for k1, v1 := range f {
        for k2, v2 := range v1 {
            fmt.Printf("(%d,%d)=%d ", k1, k2, v2)
        }
        fmt.Println()
    }
}

首先我们可以看到在main函数里面定义了一个int类型,名叫f的数组,它的属性为2行3列,第一行存储的是 {1,2,3} ,第二行存储的是 {7,8,9} ,我们通过for循环对二维数组进行一次遍历,读者暂时可以把它理解成一个循环的固定格式,后续循环会为读者一一介绍,由于本次数组是二维数组,所以我们需要调用两次for循环来对数组进行遍历,通过函数打印输出所需要的值

数组的拷贝与传参

package main
import "fmt"
func printArr(arr *[5]int) {
    arr[0] = 10
    for i, v := range arr {
        fmt.Println(i, v)
    }
}
func main() {
    var arr1 [5]int
    printArr(&arr1)
    fmt.Println(arr1)
    arr2 := [...]int{2, 4, 6, 8, 10}
    printArr(&arr2)
    fmt.Println(arr2)
}

首先我们可以看到定义了一个printArr方法,并在方法里面内置了一个长度为5、int类型的数组。紧接着我们将数组的第一个元素赋值为10,紧接着对数组进行循环遍历,分别输出数组的索引及索引位置上的值

回到main方法中,我们定义了一个名叫arr1,长度为5,int类型的数组,并直接打印该数组的地址值,同时调用函数打印出该数组未进行初始化时候的值,显而易见的是,由于我们在printArr中已经对索引位置为1的数组的值进行了一次修改,所以本次打印输出数组的时候,也会受到上一次数组的影响,所以本次数组打印输出的结果为[10 0 0 0 0]。紧接着,我们定义了一个名叫arr2,长度为任意,int类型的数组,同时给予赋值操作,但是由于在printArr索引为1的数组的位置的值已经发生了改变,所以本次arr2数组打印输出的结果为[10 4 6 8 10]

求数组所有元素之和

package main
import (
    "fmt"
    "math/rand"
    "time"
)
func sumArr(a [10]int) int {
    var sum int = 0
    for i := 0; i < len(a); i++ {
        sum += a[i]
    }
    return sum
}
func main() {
    rand.Seed(time.Now().Unix())
    var b [10]int
    for i := 0; i < len(b); i++ {
        b[i] = rand.Intn(1000)
    }
    sum := sumArr(b)
    fmt.Printf("sum=%d\n", sum)
}

我们首先定义了一个方法名叫sumArr,同时往该方法里面传入一个名为a,长度为10,数据类型为int类型的数组。在本方法里面,我们定义一个变量为sum,使用for循环来对数组进行遍历操作,同时使用sum来记录该数组各元素的和,最终返回sum的值

紧接着我们看到main方法,我们在该方法中使用rand.seed()函数来定义一个随机数,同时初始化一个名为b,长度为10,数据类型为int类型的数组使用for循环对该数组进行遍历,同时将随机数的值赋给b数组中元素。最终我们将数组sumArr中b的值赋给sum,调用函数进行打印输出sum的值

例题:数组元素匹配问题

找出数组中和为给定值的两个元素的下标,例如数组[1,3,5,8,7],

找出两个元素之和等于8的下标分别是(0,4)和(1,2)

求元素和,是给定的值

package main
import "fmt"
func myTest(a [5]int, target int) {
    // 遍历数组
    for i := 0; i < len(a); i++ {
        other := target - a[i]
        // 继续遍历
        for j := i + 1; j < len(a); j++ {
            if a[j] == other {
                fmt.Printf("(%d,%d)\n", i, j)
            }
        }
    }
}
func main() {
    b := [5]int{1, 3, 5, 8, 7}
    myTest(b, 8)
}

根据题意,我们可以得知,在myTest方法里面我们定义了一个名为a,长度为5,数据类型为int类型的数组,同时还定义了一个目标值target用于检验元素和是否正确。

紧接着我们对该数组进行遍历,定义other变量用于表示另一个数组元素,这里进行二次遍历的原因是因为本条题目需要匹配数组中两个元素的值,因此进行二次遍历匹配数组中i的值,一旦与other匹配上,即打印输出该数组的值(两个元素)

我们在main函数中对数组b进行变量初始化的赋值操作,以便进行方法的调用,如果在数组中能够找到myTest()方法中的第二个,即target元素,就打印输出这两个元素,反之则什么都不打印

今日总结

今天我们主要学习了Go语言二维数组和遍历数组中的一些应用。如遍历数组的一个固定格式,亦或是数组的拷贝与传参,这些都值得读者去仔细推敲

到此这篇关于浅析Go语言中数组的这些细节的文章就介绍到这了,更多相关Go语言数组内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • golang之数组切片的具体用法

    目录 数组 切片 切片的创建 直接声明 new方式初始化 字面量 make方式 截取方式 s[:] s[i:] s[:j] s[i:j] s[i:j:x] 看个例子 切片的扩容 内存对齐 空切片和nil切片 数组是值传递,切片是引用传递? 数组和slice能不能比较 只有长度相同,类型也相同的数组才能比较 slice只能和nil做比较,其余的都不能比较 数组 go开发者在日常的工作中slice算是用的比较多的了,在介绍slice之前,我们先了解下数组,数组相信大家都不陌生,数组的数据结构比较简单

  • Go数组与切片轻松掌握

    目录 数组(array) 初始化数组 数组赋值 遍历数组 数组对比 切片(slice) 切片的性质 切片初始化 切片赋值 切片的容量 append以及扩容 在 Go 中,数组和切片的功能其实是类似的,都是用来存储一种类型元素的集合.数组是固定长度的,而切片的长度是可以调整的 数组(array) 我们在声明一个数组的时候据必须要定义它的长度,并且不能修改. 数组的长度是其类型的一部分:比如,[2]int 和 [4]int 是两个不同的数组类型. 初始化数组 // 1. 创建一维数组 // 元素都是

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

    目录 引言 一.数组的定义 1. 语法 2. 示例 二.数组的初始化 1. 未初始化的数组 2. 使用初始化列表 3. 省略数组长度 4. 指定索引值的方式来初始化 5. 访问数组元素 6. 根据数组长度遍历数组 三. 访问数组元素 1. 访问数组元素 2. 根据数组长度遍历数组 四.冒泡排序 五.多维数组 1. 二维数组 2. 初始化二维数组 3. 访问二维数组 六.向函数传递数组 1. 形参设定数组大小 2. 形参未设定数组大小 3. 示例 总结 引言 数组是相同数据类型的一组数据的集合,数

  • 轻松读懂Golang中的数组和切片

    目录 一.数组和切片的区别是什么? 1.数组 2.切片 二.数组和切片的初始化? 1.数组 2.切片 二.常见问题 1.切片的初始化与追加 2.slice拼接问题 3.new和make的区别 总结 一.数组和切片的区别是什么? 1.数组 数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值.在初始化后长度是固定的,无法修改其长度.当作为方法的参数传入时将复制一份数组而不是引用同一指针.数组的长度也是其类型的一部分,通过内置函数len(array

  • 浅析Go语言容器之数组和切片的使用

    目录 序列容器 数组 Vector Deque List 单链表 总结 在 Java 的核心库中,集合框架可谓鼎鼎大名:Array .List.Set.Queue.HashMap 等等,随便拎一个出来都值得开发者好好学习如何使用甚至是背后的设计源码(这类文章也挺多,大家上网随便一搜). 虽然 Go 语言没有如此丰富的容器类型,但也有一些基本的容器供开发者使用,接下来让我们一一认识这些容器类型吧. 序列容器 序列容器存储特定类型的数据元素.目前有 5 种序列容器的实现: array vector

  • 浅析Go语言中数组的这些细节

    目录 Go语言基础二 len&cap 二维数组的遍历 数组的拷贝与传参 求数组所有元素之和 例题:数组元素匹配问题 今日总结 Go语言基础二 len&cap 书接上文,我们提到二维数组中的第二个维度的数组不能用...来表示,接下来我们要认识两个新的函数,它们分别是len和cap package main ​ func main() { a := [2]int{} println(len(a), cap(a)) } 由上方代码可知,我们在main函数里面定义了一个a数组,长度为2,未进行初始

  • 程序员都不知道C语言中的这些小细节

    既然题目都说了是小细节,一来就介绍细节多没意思啊,先坑坑大家再详细介绍吧,嘿嘿.直接上7个题吧,看看你能做对几个呢? 计算型细节 ①: #include <stdio.h> int main() { char a = 3; char b = 127; char c = a + b; printf("结果是:%d",c); return 0; } 您想想这个题的答案是多少?先不要看后面的答案哦 答案是 -126, 嘿嘿,是不是答错了呢?先不要着急,继续看下面的题 ②: #in

  • 详解Go语言中数组,切片和映射的使用

    目录 1.Arrays (数组) 2.切片 2.1 make创建切片 3.映射Map Arrays (数组), Slices (切片) 和 Maps (映射) 是常见的一类数据结构 1.Arrays (数组) 数组是定长的. 长度不可改变. 初始化 package main import ( "fmt" ) func main() { var scores [10]int scores[0] = 99 fmt.Printf("scoers:%d\n", scores

  • 浅析Go语言中闭包的使用

    目录 闭包基本介绍 闭包实现数字累加 代码说明 代码分析 闭包案例 上代码 代码说明 闭包基本介绍 闭包就是 一个函数 和其相关的 引用环境 组合的一个整体 好处: 保存引用的变量,下次继续使用,不会销毁 下面通过闭包的方式,写一个数字累加器,体验一下闭包的妙处 闭包实现数字累加 package main import "fmt" // 累加器 // 闭包 - 函数柯里化 // 返回值类型: func(int) int func AddUpper() func(int) int { v

  • 浅析C语言中的数组及字符数组

    我们来编写一个程序,以统计各个数字.空白符(包括空格符.制表符及换行符)以及所有其它字符出现的次数.这个程序的实用意义并不大,但我们可以通过该程序讨论 C 语言多方面的问题. 所有的输入字符可以分成 12 类,因此可以用一个数组存放各个数字出现的次数,这样比使用 10 个独立的变量更方便.下面是该程序的一种版本: #include <stdio.h> /* count digits, white space, others */ main() { int c, i, nwhite, nothe

  • c语言中数组名a和&a详细介绍

    最近又把学习c语言提上日程上来了~~~先把我打算看的书都写下来吧,<C语言深度剖析>,<c和指针>系类,<c语言陷阱和缺陷> 先说说a和&a的区别(有三点,三个方向):1.是a和&a的本质,都是什么类型的.2.从2维数组的角度看.3.从指针运算的角度看. 声明:虽然数组名不是指针,但是用的很像指针,我们暂且把它叫做一个指针吧. 第一个问题:int a[10];  a ,&a和&a[0] 都是分别是什么?先说明a ,&a和&

  • 深入浅析C语言中堆栈和队列

    1.堆和栈 (1)数据结构的堆和栈 堆栈是两种数据结构. 栈(栈像装数据的桶或箱子):是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取.这就如同要取出放在箱子里面底下的东西(放入的比较早的物体),首先要移开压在它上面的物体(放入的比较晚的物体). 堆(堆像一棵倒过来的树):是一种经过排序的树形数据结构,每个结点都有一个值.通常所说的堆的数据结构,是指二叉堆.堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆.由于堆的这个特性,常用来实现优先队列,堆的存取是随意,

  • C语言中数组的使用详解

    目录 1 数组的基本概念 2 数组定义语法 3 一维数组的初始化 3.1 全部初始化 3.2 部分元素赋初值 3.3 省略长度赋初值 4 一维数组的使用示例 4.1 求最大值.最小值.平均值 4.2 数组逆置 4.3 数组排序 4.3.1 冒泡排序 4.3.2 选择排序 选择列表中的最小值与未排序列表中的第一个值互换位置. 4.3.3 直接插入排序 5 二维数组 5.1 二维数组的概念 5.2 二维数组的初始化 5.2.1 全部初始化 按行全部赋初值 5.2.2 部分初始化 5.2.3 省略长度

  • C语言中数组的一些基本知识小结

    初始化数组 int ages[3] = {4, 6, 9}; int nums[10] = {1,2}; // 其余的自动初始化为0 int nums[] = {1,2,3,5,6}; // 根据大括号中的元素个数确定数组元素的个数 int nums[5] = {[4] = 3,[1] = 2}; // 指定元素个数,同时给指定元素进行初始化 int nums[3]; nums[0] = 1; nums[1] = 2; nums[2] = 3; // 先定义,后初始化 定义但是未初始化,数组中有

  • C语言中数组作为函数的参数以及返回值的使用简单入门

    函数通过数组作为参数 如果想通过一个一维数组作为函数的参数,就必须声明函数形式参数,使用以下三种方式与所有三个声明方法之一产生类似的结果,因为每一种方式告诉编译器,一个整数指针将会要被接收.类似的方式,可以使用多维数组形式参数. 方式-1 形式参数为指针如下.在下一章将学习什么是指针. void myFunction(int *param) { . . . } 方式-2 如下形式数组参数的大小: void myFunction(int param[10]) { . . . } 方式-3 如下形式

随机推荐