首页 > 其他分享 >Go的数组

Go的数组

时间:2024-11-26 19:59:26浏览次数:10  
标签:int fmt array5 var Println 数组 Go

Go的数组

Array数组介绍

数组是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素(element),这种类型可以是意的原始类型,比如int、string等,也可以是用户自定义的类型。一个数组包含的元素个数被称为数组的长度。在Golang中数组是一个长度固定的数据类型,数组的长度是类型的一部分,也就是说[5]int和[10]int是两个不同的类型。Golang中数组的另一个特点是占用内存的连续性,也就是说数组中的元素是被分配到连续的内存地址中的,因而索引数组元素的速度非常快。

和数组对应的类型是Slice(切片),Slice是可以增长和收缩的动态序列,功能也更灵活,但是想要理解slice工作原理的话需要先理解数组,所以本节主要为大家讲解数组的使用。

数组定义

var 数组变量名 [元素数量] T

示例

// 数组的长度是类型的一部分
var arr1 [3]int
var arr2 [4]string
fmt.Printf("%T, %T \n", arr1, arr2)

// 数组的初始化 第一种方法
var arr3 [3]int
arr3[0] = 1
arr3[1] = 2
arr3[2] = 3
fmt.Println(arr3)

// 第二种初始化数组的方法
var arr4 = [4]int {10, 20, 30, 40}
fmt.Println(arr4)

// 第三种数组初始化方法,自动推断数组长度
var arr5 = [...]int{1, 2}
fmt.Println(arr5)

// 第四种初始化数组的方法,指定下标
a := [...]int{1:1, 3:5}
fmt.Println(a)

遍历数组

方法1

// 第四种初始化数组的方法,指定下标
a := [...]int{1:1, 3:5}
for i := 0; i < len(a); i++ {
	fmt.Print(a[i], " ")
}

方法2

// 第四种初始化数组的方法,指定下标
a := [...]int{1:1, 3:5}
for _, value := range a {
    fmt.Print(value, " ")
}

数组的值类型

数组是值类型,赋值和传参会赋值整个数组,因此改变副本的值,不会改变本身的值

// 数组
var array1 = [...]int {1, 2, 3}
array2 := array1
array2[0] = 3
fmt.Println(array1, array2)

例如上述的代码,我们将数组进行赋值后,该改变数组中的值时,发现结果如下

[1 2 3] [3 2 3]

这就说明了,golang中的数组是值类型,而不是和java一样属于引用数据类型

切片定义(引用类型)

在golang中,切片的定义和数组定义是相似的,但是需要注意的是,切片是引用数据类型,如下

// 切片定义
var array3 = []int{1,2,3}
array4 := array3
array4[0] = 3
fmt.Println(array3, array4)

我们通过改变第一个切片元素,然后查看最后的效果

[3 2 3] [3 2 3]

二维数组

Go语言支持多维数组,我们这里以二维数组为例(数组中又嵌套数组):

var 数组变量名 [元素数量][元素数量] T

示例

// 二维数组
var array5 = [2][2]int{{1,2},{2,3}}
fmt.Println(array5)

数组遍历

二维数据组的遍历

// 二维数组
var array5 = [2][2]int{{1,2},{2,3}}
for i := 0; i < len(array5); i++ {
    for j := 0; j < len(array5[0]); j++ {
        fmt.Println(array5[i][j])
    }
}

遍历方式2

for _, item := range array5 {
    for _, item2 := range item {
        fmt.Println(item2)
    }
}

类型推导

另外我们在进行数组的创建的时候,还可以使用类型推导,但是只能使用一个 …

// 二维数组(正确写法)
var array5 = [...][2]int{{1,2},{2,3}}

错误写法

// 二维数组
var array5 = [2][...]int{{1,2},{2,3}}

完整代码

package main

import "fmt"

func main() {
	// 数组的长度是类型的一部分
	var arr1 [3]int
	var arr2 [4]string
	fmt.Printf("%T, %T \n", arr1, arr2)

	// 数组的初始化 第一种方法
	var arr3 [3]int
	arr3[0] = 1
	arr3[1] = 2
	arr3[2] = 3
	fmt.Println(arr3)

	// 第二种初始化数组的方法
	var arr4 = [4]int {10, 20, 30, 40}
	fmt.Println(arr4)

	// 第三种数组初始化方法,自动推断数组长度
	var arr5 = [...]int{1, 2}
	fmt.Println(arr5)

	// 第四种初始化数组的方法,指定下标
	a := [...]int{1:1, 3:5}
	fmt.Println(a)

	for i := 0; i < len(a); i++ {
		fmt.Print(a[i], " ")
	}

	for _, value := range a {
		fmt.Print(value, " ")
	}

	fmt.Println()
	// 值类型 引用类型
	// 基本数据类型和数组都是值类型
	var aa = 10
	bb := aa
	aa = 20
	fmt.Println(aa, bb)

	// 数组
	var array1 = [...]int {1, 2, 3}
	array2 := array1
	array2[0] = 3
	fmt.Println(array1, array2)

	// 切片定义
	var array3 = []int{1,2,3}
	array4 := array3
	array4[0] = 3
	fmt.Println(array3, array4)

	// 二维数组
	var array5 = [...][2]int{{1,2},{2,3}}
	for i := 0; i < len(array5); i++ {
		for j := 0; j < len(array5[0]); j++ {
			fmt.Println(array5[i][j])
		}
	}

	for _, item := range array5 {
		for _, item2 := range item {
			fmt.Println(item2)
		}
	}
}

标签:int,fmt,array5,var,Println,数组,Go
From: https://blog.csdn.net/weixin_72525373/article/details/144042316

相关文章

  • Go的切片
    Go的切片为什么要使用切片切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。切片是一个引用类型,它的内部结构包含地址、长度和容量。声明切片类型的基本语法如下:varname[]T其中:name:表示变量名T:表示切......
  • COMP4134 Algorithms and Data Structures
    ProjectinAdvancedAlgorithmsandDataStructuresCOMP4134UNNCOverviewForthisproject,youaretaskedwithsolvingareal-worldtransportationproblem.Formallyspeaking,itiscalledthepickupanddeliveryproblemwithtimewindows(PDPTW).Thepi......
  • 洛谷P1719 最大加权矩形 (最大子数组和 加强版)
    P1719最大加权矩形先给一个 n×n 矩阵,1<=n<=127。要求矩阵中最大加权矩形,即矩阵的每一个元素都有一权值,权值定义在整数集上。从中找一矩形,矩形大小无限制,是其中包含的所有元素的和最大。矩阵的每个元素属于 [-127,127],例如0–2–7092–62-41–41......
  • leetcode 53. 最大子数组和
    53.最大子数组和给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。 法一1.假如全是负数,那就是找最大值即可,因为负数肯定越加越大。2.如果有正数,则肯定从正数开始计算和,不然前面有负值,......
  • Django框架--ORM操作
    1.查询操作1.1filter()用法:用于过滤查询结果,返回符合条件的记录。支持链式调用。示例:queryset=MyModel.objects.filter(field=value)SQL查询示例:SELECT*FROMMyModelWHEREfield=value;性能特点:根据过滤条件生成SQL查询。支持复杂查询条件,性能取决于查询条件和索引。1......
  • DJANGO进阶:信号机制
    django信号是一种机制,允许你在特定事件发生时(不需要再次修改"特定事件"的代码),执行另一部分的代码逻辑意义:类似于装饰器的作用,可以在不修改现有代码的逻辑下,触发自定义逻辑常见用途数据变更通知:当模型实例被创建、更新或删除时发送信号用户注册/登录:在用户注册或登录......
  • Django框架--中间件
    一、介绍1.中间件的定义Django中间件是一个轻量级、底层的“插件”系统,用于全局地修改Django的输入或输出。每个中间件组件可以对请求进行处理或对响应进行处理,或者同时处理二者。2.中间件的功能中间件可以执行的操作包括:请求预处理:在视图函数处理请求之前,执行一些前置操作(如......
  • 对数组操作的相关js函数
    汇总一下js中,数组的相关函数(如有问题,请在评论区q我哦!感谢!)1.添加和删除数组元素//1.push在数组末尾添加一个或多个元素,并返回新的长度(改变原数组)letarray=[1,2,3];array.push(4);console.log(array);//输出[1,2,3,4]//2.pop移除数组末尾的一个元素,并返......
  • 【速通GO】基础结构和语法
    独立站原文基础结构以及执行方式基础结构//包名packagemain//引入包import"fmt"//main函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有init()函数则会先执行该函数//注意{不能单独放在一行,否则在运行时会产生错误func......
  • Go语言基本数据类型和运算符
    1.Go语言基本数据类型和运算符Go语言是静态编程语言。在Go语言中,数据类型用于声明函数和变量。当编译器编译Go程序时,通过某个值的数据类型,编译器就能够知晓要为这个值分配多大内存。值被存储在指定大小的内存中后,就可以通过算术、关系、逻辑等运算符对其进行计算。1.1Go语言变......