当前位置: 首页 > news >正文

Go语言的内置容器

文章目录

  • 一、数组
      • 数组的定义
      • 数组声明
      • 数组特点
      • 数组元素修改
  • 二、切片
      • 切片声明
      • 基于数组创建切片
      • 使用make()函数构造切片
      • 使用append()为切片动态添加元素\
      • 使用copy()复制新的切片
      • 数组与切片相互转换
  • 三、Map映射
      • Map定义
      • 使用make()函数创建map
      • 用切片作为map的值
      • 使用delete()函数删除元素

一、数组

数组的定义

一个由固定长度的特定元素组成的序列

数组声明

标准格式声明数组:

var variable_name [size]type

初始化数组:

var variable_name = [size]type{value,...}

编译器自行推断数组大小:

var variable_name = [...]type {value,...}

一些示例:

//示例1
var a [3] int  //声明一个数组为 a ,类型为int,大小为3的数组
a[0] = 12 //为第一个元素填充数据,为12
a[1] = 13 //为第二个元素填充数据,为13
a[2] = 14 //为第三个元素填充数据,为14//示例2
var a = [3] int {12,13,14} //定义且声明数组内容//示例3
a := [3]int {12,13,14}//定义且声明数组内容//示例4
a := [3]int{12}//可以只填充部分数据//示例5
a := [3]int {1:13,2:14}//填充指定位置//示例6
a := [...]int{12,13,14}//编译器自行判断数组长度

数组特点

  • 数组的每个元素可以通过索引下标来访问
  • 索引下标的范围从0开始到数据长度减1结束
  • 数组无法灵活扩容:在定义数组元素数量后,赋值元素变量个数必须要小于或者等于预设值的元素数量
  • type指任意的基本类型,也可以是数组本身,实现多维数组
  • 在Go语言中数组是值类型而不是引用类型
  • 这意味着当数组变量被赋值时,将会获得原数组的拷贝,新数组中元素的改变不会影响原数组中元素的值

示例:

package main
import "fmt"
func main() {a := [...]int{12, 78, 50}b := a	// 将a数组复制给b数组b[0] = 60fmt.Println(a)fmt.Println(b)
}//运行结果为:
//[12 78 50]
//[60 78 50]

数组元素修改

package main
import "fmt"
func main() {var a [1]string                          //定义一个1个元素的string类型数组,string默认值为空var b = [2]string{“a”, “b”}  //定义一个2个元素的string类型数组c := [3]string{"a", "b", "c"}         //定义并初始化一个3个空间的string类型数组d := [...]string{"a", "b", "c", "d"} //自动推到元素个数e := d                                        //拷贝数组e[0] = "e"                                  //修改数组指定位置的值fmt.Println(a, len(a))                 //打印a数组、a数组长度fmt.Println(b)fmt.Println(c)fmt.Println(d, len(d))fmt.Println(e, len(e))
}//运行结果为:
//[] 1
//[a b]
//[a b c]
//[a b c d] 4
//[e b c d] 4

二、切片

数组和切片的对比
在这里插入图片描述

切片声明

切片声明:

var name[]type = []type{......}

切片特点:

  • []中不需要指定长度,即长度是不固定的
  • 可以追加元素,在追加时可能使切片的容量增大,可以从数据中生成新的切片或者是声明新的切片

示例:

package main
import "fmt"
func main() {var a []int= []int{10,11,12,13}fmt.Println(a,len(a))
}//运行结果为:
//[10 11 12 13] 4

基于数组创建切片

var name [] type = 数组名[开始位置:结束位置]

特点:

  • 结束位置的元素不取
  • 切片数量 = 结束位置下标 - 开始位置下标
  • 当缺省开始位置时,表示从连续的区域开头到结束位置
    在编程和数据处理领域,"缺省"(或“默认”)通常指的是在没有明确指定某个值或选项时,系统或程序将自动采用的一个预设值或行为。这个预设值或行为被称为“缺省值”或“默认值”。
  • 当缺省结束位置时,表示从开始位置到整个连续区域末尾
  • 两者同时缺省时,与数组本身等效
  • 两者同时为0时,等于空切片,一般用于切片复位

示例:


//示例1
package main
import "fmt"
func main() {a := [5]string{"A","B","C","D"}var b []string = a[1:2]fmt.Println(a)fmt.Println(b,len(b))
}//运行结果为:
//[A B C D ]
//[B] 1
//示例2
package main
import "fmt"
func main() {a := [5]int{76, 77, 78, 79, 80}var b []int = a[1:3]	//取a数组的第1到第3个元素var c []int = a[:3]	//取a数组的第0到第3个元素var d []int = a[1:]	//取a数组的第1到最后一个元素var e []int = a[:]	//取a数组的第0到最后一个元素var f []int = a[0:0]	//空切片fmt.Println(a,len(a))fmt.Println(b,len(b))fmt.Println(c,len(c))fmt.Println(d,len(d))fmt.Println(e,len(e))fmt.Println(f,len(f))
}//运行结果为:
//[76 77 78 79 80] 5
//[77 78] 2
//[76 77 78] 3
//[77 78 79 80] 4
//[76 77 78 79 80] 5
//[] 0
  • 切片本身不包含任何数据
  • 切片是底层数组的一个上层表示
  • 对切片进行的任何修改都将反映在底层数据化中
package main
import "fmt"
func main() {a := [5]string{"A","B","C","D","E"}var b []string = a[1:3]fmt.Println("修改前的a数组:",a)fmt.Println("修改前的b切片:",b)b[1]="2"fmt.Println("修改后的a数组:",a)fmt.Println("修改后的b切片:",b)
}//运行结果为:
//修改前的a数组: [A B C D E]
//修改前的b切片: [B C]
//修改后的a数组: [A B 2 D E]
//修改后的b切片: [B 2]
  • 切片的长度是指切片中元素的个数
  • 切片的容量是指从切片的起始元素开始到其底层数组中的最后一个元素的个数
  • 切片的长度可以动态的改变(最大为其容量)
  • 任何超出最大容量的操作都会发生运行时错误
package main
import ("fmt"
)
func main() {a := [...]string{"A", "B", "C", "D", "E"}b := a[1:3]fmt.Printf("数组a长度为:%d \n切片b容量为:%d", len(a), cap(b))
}//运行结果为:
//数组a长度为:5 
//切片b容量为:4

使用make()函数构造切片

var name [] type = make([]type,size,cap)

特点:

  • type指切片元素类型
  • size 指的是为这个类型分配多少个元素
  • cap 为预分配的元素数量
  • cap设定后不会影响 size,只是为了提前分配空间,降低多次分配空间造成的性能问题
package main
import "fmt"
func main() {var a [] int =make([]int,5,10)
//创建一个切片,初始元素个数为5,并预留10个元素的存储空间a[0]=10a[4]=14fmt.Println("切片内容:", a)fmt.Println("切片长度:", len(a))fmt.Println("切片容量:", cap(a))
}//运行结果为:
//切片内容: [10 0 0 0 14]
//切片长度: 5
//切片容量: 10

使用append()为切片动态添加元素\

append(name,value)
append(name,[]type[value,value,value]...)

特点:

  • 可以为切片追加单个或多个元素;或者是追加切片
  • 使用append()函数为切片动态添加元素时,如果空间不足以容纳足够多的元素,切片就会进行“扩容”,此时新切片的长度会发生改变。
  • 扩展容量小于1024个元素时按当前切片的容量(Cap)2倍扩容,扩展容量大于1024个元素时按Cap的1/4扩容。
package main
import“fmt”
func main() {a := []int{10, 20, 30, 40, 50}b := a[1:3]fmt.Println(a)fmt.Println(b)b = append(b, 60)fmt.Printf(“第一次追加后,切片a为:%d 切片a容量为:%d\n", a, cap(a))fmt.Printf(“第一次追加后,切片b为:%d 切片b容量为:%d\n", b, cap(b))b = append(b, 70,80,90,100)fmt.Printf(“第二次追加后,切片a为:%d 切片a容量为:%d\n", a, cap(a))fmt.Printf(“第二次追加后,切片b为:%d 切片b容量为:%d\n", b, cap(b))
}//运行结果为:
//[10 20 30 40 50]
//[20 30]
//第一次追加后,切片a为:[10 20 30 60 50] 切片a容量为:5
//第一次追加后,切片b为:[20 30 60] 切片b容量为:4
//第二次追加后,切片a为:[10 20 30 60 50] 切片a容量为:5
//第二次追加后,切片b为:[20 30 60 70 80 90 100] 切片b容量为:8

在对切片 b 进行第一次 append 时,由于它仍然指向 a 的底层数组,因此 a 和 b 共享数据;但第二次 append 超出容量时,切片 b 就会分配新的底层数组,不再共享 a 的数据。

使用copy()复制新的切片

copy(destSlice,srcSlice)

特点:

  • destSlice 为复制的目标切片
  • srcSlice 为数据来源切片
  • 目标切片必须分配过空间且足够承载复制的元素个数,并且来源和目标的类型必须一致。
  • copy() 函数来源切片和目标切片可以共享同一个底层数组,甚至有重叠也没有问题。
package main
import "fmt"
func main() {a := []int{0,1,2,3,4,5}b := []int{10,11,12}fmt.Println(a)fmt.Println(b)copy(b,a)  // 只会复制a的前3个元素到b中fmt.Println(a)fmt.Println(b)
}//运行结果为:
//[0 1 2 3 4 5]
//[10 11 12]
//[0 1 2 3 4 5]
//[0 1 2]

数组与切片相互转换

  • 需要使用[:]将数组伪装为切片类型后再进行赋值,否则无法通过编译
  • 数组与切片中的元素类型必须相同

切片转成数组:

package main
import "fmt"
func main() {//切片转成数组s := []int{10, 11, 12}var a [3]intfmt.Println(copy(a[:], s))fmt.Println(a)
}//运行结果为:
//3
//[10 11 12]

数组转成切片:

package main
import "fmt"
func main() {//数组转成切片a := [...]int{10, 11, 12}b := make([]int, 3)fmt.Println(copy(b, a[:]))fmt.Println(b)
}//运行结果为:
//3
//[10 11 12]

三、Map映射

Map定义

一种无序的Key/value的集合
能够通过key值快速检索数据值
map这种数据结构在其他编程语言中也称为字典、映射或哈希表。
Golang的map由两种重要的结构构成:hmap和bmap

声明map集合:

var name map[key_type]value_type

语法说明如下:

  1. name为map变量名
  2. key_type为键类型
  3. value_type为键值对应值类型
package main
import "fmt"
func main() {a:=map[int]string{110:"报警电话",120:"急救电话",119:"消防电话"}fmt.Println(a)
}//运行结果为:
//map[110:报警电话 119:消防电话 120:急救电话]

使用make()函数创建map

make(map[KeyType]ValueType, [cap])

特点:

  • map可以在声明的时候填充元素,也可以单独填充元素
  • map中的数据都是成对出现的
  • map类型的变量默认初始值为nil
  • 其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量。

用切片作为map的值


//示例1package main
import "fmt"
func main() {a := make(map[string]int,10)a["报警电话"] = 110;a["急救电话"] = 120;a["火警电话"] = 119;fmt.Println(a)
}//运行结果为:
//map[急救电话:120 报警电话:110 火警电话:119]

//示例2
package main
import "fmt"
func main() {//map的值为切片:a := make(map[int][]string, 2)// 创建一个容量为 2 的 map,键为 int,值为 []string(切片)a[1] = make([]string, 0, 2)      // 为键 1 初始化一个长度为 0、容量为 2 的切片a[1] = append(a[1], "A", "a") // 向切片中追加元素 "A" 和 "a"fmt.Println(a)
}//运行结果为:
//map[1:[A a]]

//示例3
package main
import "fmt"
func main() {//切片的元素类型为map:b := make([]map[string]int, 2)b[0] = make(map[string]int, 2)b[0]["A"] = 1b[0]["a"] = 2fmt.Println(b)
}//运行结果为:
//[map[A:1 a:2] map[]]

使用delete()函数删除元素

delete(map,key)

特点:

  • 如果要删除的key不存在,那么这个调用将什么都不发生,也不会有什么副作用
  • 但是如果传入的map变量的值是nil,该调用将导致程序抛出异常(panic)
示例
package main
import "fmt"
func main() {a:=map[int]string{110:"报警电话",120:"急救电话",119:"消防电话"}delete(a,110)fmt.Println(a)
}//运行结果为:
//map[119:消防电话 120:急救电话]

相关文章:

Go语言的内置容器

文章目录 一、数组数组的定义数组声明数组特点数组元素修改 二、切片切片声明基于数组创建切片使用make()函数构造切片使用append()为切片动态添加元素\使用copy()复制新的切片数组与切片相互转换 三、Map映射Map定义使用make()函数创建map用切片作为map的值使用delete()函数删…...

HCIP考试怎样预约?随时可以考试吗?

HCIP(华为认证互联网协议专家)的考试并不是随时都能参加的,考生需要避开法定节假日来预约考试。具体的考试时间会根据所选的认证方向和考试中心有所变化。考生可以通过华为人才在线平台或者直接联系Pearson VUE来安排考试时间。 HCIP认证考试…...

香港航空 阿里滑块 acw_sc__v3 分析

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 有相关问题请第一时间头像私信联系我删…...

JS传统函数中常见的 this 绑定问题

在 JavaScript 中,传统函数的 this 绑定规则依赖于函数的调用方式,这常常导致一些意外的行为和常见的 this 绑定问题。以下是一些典型的 this 绑定问题及其解决方案。 1. 作为对象方法调用时的 this 丢失 当一个对象的方法被赋值给一个变量或作为回调函…...

跨域问题以及使用vscode的LiveServer插件跨域访问

目录 现象跨域问题的定义(文心一言)解决办法同源部署后端代理VS Code LiveServer 现象 以下前端代码部署后,在网页访问时报错:No ‘Access-Control-Allow-Origin’ header is present on the requested resource. $.ajax({url:…...

现代Web开发:WebSocket 实时通信详解

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 现代Web开发:WebSocket 实时通信详解 现代Web开发:WebSocket 实时通信详解 现代Web开发:WebS…...

《深度学习》——深度学习基础知识(全连接神经网络)

文章目录 1.神经网络简介2.什么是神经网络3.神经元是如何工作的3.1激活函数3.2参数的初始化3.2.1随机初始化3.2.2标准初始化3.2.3Xavier初始化(tf.keras中默认使用的)3.2.4He初始化 4.神经网络的搭建4.1通过Sequential构建神经网络4.2通过Functional API…...

nginx 部署2个相同的vue

起因: 最近遇到一个问题,在前端用nginx 部署 vue, 发现如果前端有改动,如果不适用热更新,而是直接复制项目过去,会404 因此想到用nginx 负载两套相同vue项目,然后一个个复制vue项目就可以了。…...

利用Java easyExcel库实现高效Excel数据处理

在Java应用程序中,处理Excel文件是一项常见任务,尤其是在需要读取、写入或分析大量数据时。easyExcel是一个基于Java的高性能Excel处理库,它提供了简洁的API和优化的性能,以简化Excel文件的处理。本文将指导您如何使用easyExcel库…...

Vulnhub靶场 Metasploitable: 1 练习(上)

目录 0x00 准备0x01 主机信息收集0x02 Samba服务(CVE-2007-2447)0x03 Distccd(CVE-2004-2687)0x04 Mysql弱口令0x05 Postgresql弱口令0x06 Telnet弱口令0x07 Tomcat 0x00 准备 下载链接:https://download.vulnhub.com/…...

《Python编程实训快速上手》第二天--列表与元组

一、列表 1、理解 列表是一个值,包含由多个值构成的序列 2、元素查找 1)索引--取列表中的单个值 正数索引:同c语言中的数组 spam [[1,2,3,4],["cat","dog"]] print(spam[0][1]) #结果:2 负数索引&…...

jangow靶机

先改jangow的ip设置,无ip地址,重启jangow虚拟机时候快速按E这个键盘,进入到编辑模式,找到ro这个位置,写入ro rw signin init/bin/bash ​,ctrlx保存 下一步需要更改网卡名字为ens33,可以直接…...

使用UDP协议传输视频流!(分片、缓存)

背景 最近在开发工作中遇到需要两台本地设备之间进行视频流的传输的情况。但是团队一来没有这方面的专业人才,二来视频流的传续数据量很大,针对TCP和UDP的具体选择也不明确。 本文是在上诉背景之下进行的研究和开发工作。 目录 背景 UDP和TCP协议的…...

Pinia小菠萝(状态管理器)

Pinia 是一个专为 Vue 3 设计的状态管理库,它借鉴了 Vuex 的一些概念,但更加轻量灵活。下面将详细介绍如何使用 Pinia 状态管理库: 安装 Pinia 使用 npm:在项目目录下运行npm install pinia。使用 yarn:在项目目录下运…...

Python知识点:基于Python工具,如何使用Web3.py进行以太坊智能合约开发

开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! 基于Python工具Web3.py进行以太坊智能合约开发 简介 智能合约是区块链技术的核…...

【简信CRM-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...

ssm+vue694基于Java的药店药品信息管理系统的设计与实现

博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…...

Sentinel微服务保护

目录 雪崩问题 解决雪崩问题的方法: 我们使用sentinel组件实现微服务的保护 一:下载sentinel 二.启动sentinel 三.访问:localhost:8080 默认的账号和密码都是sentinel 微服务整合sentinel 一.导入sentinel依赖 二.在application.yml配置…...

喜讯!实在Agent智能体入选《2024年度最佳企业服务AI产品榜》

10 月 30 日,硅星人主办的首届 AI 创造者大会(ACC)于北京中关村盛大举行。此次大会旨在为 AI 产业生态的共建者构筑一个多元化的交流平台。大会邀请了硅星人创始人兼 CEO 骆轶航、国家地方共建具身智能机器人创新中心 CTO 唐剑、百度智能云应…...

Aop+自定义注解实现数据字典映射

数据字典 Web项目开发中,字典表的一般都会存在,主要用来给整个系统提供基础服务。 比如男女性别的类型可以使用0和1来进行表示,在存储数据和查询数据的时候,就可以使用字典表中的数据进行翻译处理。 再比如之前做的一个项目中宠物…...

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

React Native 导航系统实战(React Navigation)

导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...