golang-基础知识(array, slice, map)

news2024/11/13 21:27:01

1. array

array就是数组,我们可以通过如下方式定义一个数组并对数组中的元素进行赋值

var arr [n]type  // 定义一个大小为n,类型为type的数组
arr[0] = xx // 对数组中的元素进行赋值

其中[n]type中,n表示数组的长度,type表示数组的类型,由于长度也是数组类型的一部分,所以[3]int和[4]int是两种不同的类型,数组也就不能改变长度

简单例子:

package main

import (
	"fmt"
)

func main() {
	var arr [4]int
	arr[0] = 1
	fmt.Print(arr)
}

这里我们定义了一个长度为4的Int数组,并将数组中的第一个元素赋值为1,最后打印出该数组

可以看到,除了第一个元素外,其它三个元素都使用了默认值0

同样的,我们可以使用 := 来简化数组的声明,例子如下

package main

import (
	"fmt"
)

func main() {
	arr1 := [3]int{1, 2, 3}         // 声明了一个长度为3的int数组
	arr2 := [10]int{1, 2, 3}        // 声明了一个长度为10的int数组,其中前三个元素初始化为1、2、3,其它默认为0
	arr3 := [...]int{1, 2, 3, 4, 5} // 可以省略长度而采用`...`的方式,Go会自动根据元素个数来计算长度
	fmt.Println(arr1)
	fmt.Println(arr2)
	fmt.Println(arr3)

	// 声明了一个二维数组,该数组以两个数组作为元素,其中每个数组中又有4个int类型的元素
	arr4 := [2][4]int{[4]int{3, 3, 3, 3}, [4]int{4, 4, 4, 4}}
	fmt.Println(arr4)

	// 上面的声明可以简化,直接忽略内部的类型
	arr5 := [2][4]int{{1, 1, 1, 1}, {2, 2, 2, 2}}
	fmt.Println(arr5)
}

我们可以通过以上方便的声明不同长度,不同类型的数组(包括二维数组),运行结果如下:

2. slice

很多时候,我们并不知道具体要用多大的数组,无法确定数组的长度,因此就有了slice(切片)的概念,slice可以理解成一个动态的数组,但它又不是一个真正意义上的动态数组,而是一个引用类型,总是指向一个array,它的声明和array类似,只是省略了长度

var sli []int

slice可以定义一个空slice并逐渐追加元素或者,从一个已经定义好的数组或者slice中再次声明(通过array[i:j]获取,包括从i到j-1元素,其中i和j都可以省略,这里用法和python一致),例子如下:

package main

import (
	"fmt"
)

func main() {
	// 定义一个空slice并逐渐追加元素
	var aSlice []int
	aSlice = append(aSlice, 0)
	fmt.Println(aSlice)

	// 从一个已经定义好的数组或者slice中再次声明
	byteArray := [10]byte{'a', 'b', 'c'}
	fmt.Println(byteArray)
	byteS1 := byteArray[1:5]
	fmt.Println(byteS1)
	byteS2 := byteS1[1:3]
	fmt.Println(byteS2)

}

运行结果如下:

由于slice是引用类型,当同时有多个slice指向同一个数组时,其中一个slice的修改会影响到其它的slice,比如,在上面的例子中增加如下代码

byteS2[0] = 10
fmt.Println("afte modify")
fmt.Println(byteS1)
fmt.Println(byteS2)

输出结果后,我们发现,两个slice的值都发生了变化

slice有一些有用的内置函数

len返回切片的长度
append往切片中追加元素,存在多个切片指向同一个数组时,更新一个切片可能会更新其它切片
cap返回切片的最大容量
copy从src切片复制元素到到目标dst,返回复制元素的个数(为src和dst切片长度的最小值)

使用这些内置函数的例子如下:

package main

import (
	"fmt"
)

func main() {
	// 从一个已经定义好的数组或者slice中再次声明
	byteArray := [10]byte{'a', 'b', 'c'}
	fmt.Println(byteArray)
	byteS1 := byteArray[1:5]
	fmt.Println(byteS1)
	byteS2 := []byte{'v', 'w'}
	num := copy(byteS2, byteS1)
	fmt.Printf("byteS2 = %v, num = %v\n", byteS2, num)

	byteS2 = append(byteS2, 'f')
	fmt.Println(byteS2)
	fmt.Printf("the len of byteS2 = %v, and the cap of byteS2 = %v\n", len(byteS2), cap(byteS2))
}

在代码中,我们定义了两个切片,然后执行拷贝,添加,计算长度,容量操作,结果如下:

3. map

map,字典,键值对的形式,格式为map[keyType]valueType,map的读取和设置和slice类似,只不过slice的下标只能是int类型,而map可以是多种类型,可以是string, int, 或者其它定义了==与!=操作的类型

一个简单例子如下:

package main

import "fmt"

func main() {
	var m map[string]int
	m = make(map[string]int)
	m["a"] = 1
	m["b"] = 2
	fmt.Printf("m[a] = %v, m[b] = %v", m["a"], m["b"])
}

以上代码定义了一个string到int的map,这种定义方式需要在使用之前使用make进行初始化,初始化后,给map中元素赋值,赋值之后并打印出相应的元素

使用map的时候需要注意以下几点

  • map是无序的,不能通过index获取,只能通过key获取
  • map的长度不固定,这点和slice一致,也就是说,map也是引用类型(两个map指向同一个底层,一个map的改变也会影响到另一个map)
  • 内置函数len同样适用于map,返回的是map的key的个数
  • map的值可以很方便修改,map[key] = newValue即可
  • map和其它基本类型不同,它不是线程安全的,如果存在多个go-routine读取时,需要使用mutex lock机制

除了以上几点,map也存在简单初始化,判断key是否存在,以及删除key的操作,例子如下:

package main

import "fmt"

func main() {
	m := map[string]string{
		"myname":  "lilei",
		"teacher": "wang",
	}
	value, ok := m["myname"]
	if !ok {
		fmt.Println("key history not exists")
	} else {
		fmt.Printf("the value of key myname is %v\n", value)
	}
	delete(m, "myname")
	fmt.Println(m)
}

这里初始化了一个map,查询map中的值并删除,结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2127180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数字】xilinx的AXI VIP如何使用的guide

AXI 验证 IP (VIP)AXI Stream VIP 可用于为支持定制 RTL 设计流程的 AXI 主设备及 AXI 从设备验证连接和基本功能性。此外,它还支持贯通模式,该模式明显有助于用户监控事务处理信息/吞吐量或驱动有源激励。AXI VIP 提供的实例测试台和测试可演…

SolidWorks 质量属性和截面属性

系列文章目录 前言 SOLIDWORKS 应用程序根据模型几何体和材料属性计算质量、密度、体积等属性。 您可覆盖某些属性的计算值。 您可查看以下质量属性: 零件多实体零件中的实体装配体装配体中的零部件 在零件或装配体中,您可查看面和草图的区域属性。 您可…

【HarmonyOS NEXT】实现网络图片保存到手机相册

【问题描述】 给定一个网络图片的地址,实现将图片保存到手机相册 【API】 phAccessHelper.showAssetsCreationDialog【官方文档】 https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-photoaccesshelper-V5#showassetscreationdialog…

【FastAPI】离线使用Swagger UI 或 国内网络如何快速加载Swagger UI

在FastAPI中,默认情况下,当应用启动时,Swagger UI 会通过在线加载 Swagger UI 的静态资源。这意味着如果应用运行在没有互联网连接的环境中,默认的 Swagger 文档页面将无法加载。 为了在离线环境中使用 Swagger UI,你…

二分思想与相关例题(上)

在上一篇浅谈二分思想中,我们谈到了提过二分的本质,其实就是不断折半,折到最后折无可折的那个结果就是最符合要求的结果。 现在我们从答案出发,对答案的整体可能范围不断二分,最后找到最合适的答案。我们称这种方法为…

Visual Studio安装教程

这次我给大家讲一下Visual Studio安装 一、官网下载 官网下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/ 下载下来的是一个.exe文件 双击打开,出现下面的界面 二、安装visual studio (一)更改安装路径 首先&am…

Oracle数据恢复—Oracle数据库误删除表数据如何恢复数据?

删除Oracle数据库数据一般有以下2种方式:delete、drop或truncate。下面针对这2种删除oracle数据库数据的方式探讨一下oracle数据库数据恢复方法(不考虑全库备份和利用归档日志)。 1、delete误删除的数据恢复方法。 利用oracle提供的闪回方法…

小程序——生命周期

文章目录 运行机制更新机制生命周期介绍应用级别生命周期页面级别生命周期组件生命周期生命周期两个细节补充说明总结 运行机制 用一张图简要概述一下小程序的运行机制 冷启动与热启动: 小程序启动可以分为两种情况,一种是冷启动,一种是热…

202409011在飞凌的OK3588-C的核心板跑Rockchip原厂的Android12时挂载触摸屏ft5x06之后使用i2c-tools检测

1|console:/ # i2cdetect --version console:/ # i2cdetect -l console:/ # i2cdetect -F 7 console:/ # i2cdetect -a -y 7 1|console:/ # i2cdump --version console:/ # i2cdump -f -y 7 0x38 202409011在飞凌的OK3588-C的核心板跑Rockchip原厂的Android12时挂载触摸屏ft5x0…

基于SpringBoot+Vue+MySQL的瑜伽馆管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 本系统采用SpringBoot作为后端框架,Vue.js构建前端用户界面,MySQL作为数据库存储系统,实现了瑜伽馆的全面数字化管理。系统涵盖会员管理、课程预约、教练排班、收入统计等功能模块&#xff0c…

苍穹外卖Day01

文章目录 目录 文章目录 前端环境搭建 后端环境搭建 后端-数据库环境搭建 前后端联调 前端环境搭建 打开文件夹(确保nginx在英文目录下)双击ngnix.exe启动nginx服务,访问端口号80在地址栏输入localhost打开界面 后端环境搭建 熟悉项目…

Node.js运行环境搭建

【图书介绍】《Node.jsMongoDBVue.js全栈开发实战》-CSDN博客 《Node.jsMongoDBVue.js全栈开发实战(Web前端技术丛书)》(邹琼俊)【摘要 书评 试读】- 京东图书 (jd.com) 本节介绍如何搭建Node.js运行环境。 1.2.1 Node.js运行环境安装 进入Node.js官…

淘宝 npmmirror 镜像站的使用

1、访问网址 https://npmmirror.com/ 2、由于国内直接使用 npm 的官方镜像是非常慢的,推荐使用淘宝 NPM 镜像。 淘宝 NPM 镜像是一个完整 npmjs.org 镜像,可以用于代替官方版本。 3、操作方法也非常的简单,只需要在安装完npm后&#xff0…

数据结构:堆的算法

目录 一堆的向上调整算法二堆的向下调整算法三堆的应用:堆排序四TOPK问题 一堆的向上调整算法 我们在堆中插入一个数据一般实在堆的最后插入然后可以一步一步与上层结点(父结点进行比较),继而进行交换,完成二叉树的结构&#xff0…

Spring Cloud之三 网关 Gateway

1:Intellij 新建项目 spring-cloud-gateway 2:pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLoca…

Vulnhub靶场 DC-2

靶机地址:https://www.vulnhub.com/entry/dc-2,311/ 导入到VMware里面去, 设置NAT模式 namp扫描一下c段获取ip地址, 然后再扫描ip地址获取详细的信息 得到ip 192.168.75.134 无法访问 按照下面这个方法可以访问了 在kali上的处理 flag1 网站上就存在 提示了一个cewl工具,…

【Unity踩坑】使用Input System后UI EventSystem的冲突

在项目中使用Input System&#xff0c;在UI中添加了元素后&#xff0c;再次运行出现下面的错误&#xff1a; InvalidOperationException: You are trying to read Input using the UnityEngine.Input class, but you have switched active Input handling to Input System pac…

基于SpringBoot+Vue+MySQL的考编论坛网站

系统展示 用户前台界面 管理员后台界面 系统背景 在当前信息化高速发展的时代&#xff0c;考编已成为众多求职者的重要选择。然而&#xff0c;备考过程中信息获取、经验交流及资源分享的需求日益凸显。基于SpringBoot、Vue.js与MySQL构建的考编论坛网站应运而生&#xff0c;旨在…

微软面向所有用户推出 Xbox Game Pass Standard

2024 年 8 月下旬&#xff0c;微软启动了 Xbox Game Pass Standard 的公开测试&#xff0c;这是其不断发展的 Game Pass 套餐中的一个新层级。几周后的今天&#xff0c;Xbox Game Pass 标准版已向支持地区的所有 Xbox 用户开放。 Xbox Game Pass 标准版每月收费 14.99 美元。以…

【可测试性实践】C++ 单元测试代码覆盖率统计入门

引言 最近在调研C工程怎么做单元测试和代码覆盖率统计&#xff0c;由于我们工程有使用Boost库&#xff0c;尝试使用Boost.Test来实现单元测试并通过Gcov和Lcov来生成代码覆盖率报告。本文记录完整的搭建测试Demo&#xff0c;希望能带来一定参考。 常用C单测框架对比 特性Goo…