golang 中的复合类型

前言 所有的api文档都可以使用bash命令 go doc 查看文档的帮助信息
从 Go 1.13 开始,godoc 不再随 Go 发行版一起安装,你需要单独安装它。
需要单独安装
1. go install golang.org/x/tools/cmd/godoc@latest
2执行命令 godoc -http=:1111 打开浏览器 http://localhost:1111/pkg/ 即可查看文档

复合类型

作为java人,go中的数据类型分为基本数据类型 和复合数据类型 基本数据类型都很好记 int8 int16 int32 int64 uint8 uint16 uint32 uint64 rune 也是int32 如果有
在这里插入图片描述
值得注意的是go 字符就是采用int32 存储

	// 字符类型 同时这个也是int32var char rune = 'A'fmt.Println("Character:", char)//输出asc码 65// 字节类型 同时无符号unit8var byteVal byte = 'B'fmt.Println("Byte:", byteVal)// 字符类型 同时这个也是int32 采用%c 格式化var char rune = 'A'fmt.Printf("Character:%c\n", char)// 字节类型 同时无符号unit8var byteVal byte = 'B'fmt.Printf("Byte:%c\n", byteVal)	

其中有个好玩的的类型iota

一个自增数 可以配合使用作为枚举或者状态码使用

	/**iota是go语言中的一个特殊类型 可以编译器认为是自动修改的常量*/const (a = iotab = iotac = iotad = iotae = iotaf = iota)fmt.Println(a, b, c, d, e, f)println("一组常量值的iota初始值为0")const (//由于常量中如果不申明变量的话和上一个一样 那么可以利用这个特性来写iotamale = iotafemaleother)println(male, female, other)

编辑器就把这个结果输出了
在这里插入图片描述

数组 arrary

数组虽然是复合类型 可以存储多个同类型数据,但是在go中是值传递 不是引用传递

申明方式
	var arr [5]int //声明一个长度为5的整型数组arr[0] = 10arr[1] = 20arr[2] = 30//申明赋值同时进行var arr2 [5]int = [5]int{10, 20, 30, 30, 30}var arr3 = [5]int{10, 20, 30, 30, 30}arr4=:[3]{1,2,3}var arr5 = [...]int{10, 20, 30, 30, 30} //简短声明方式 ...自动根据已有的元素长度申明//索引10为20 索引30=30var arr6 = [...]int{10: 20, 30: 30}     //简短声明方式  这赋值就是数组特定位置有值 其他位置为数组类型默认	
遍历 foreach和fori
	defer fmt.Println("遍历方法完成")arr := [5]int{10, 20, 30, 30, 30}//for i := 0; i < len(arr); i++ {//	//经典的for i//	fmt.Println(arr[i])//}for index, value := range arr {//range 遍历数组   遍历返回索引和值 map返回 key 和 valuefmt.Println(index)fmt.Println(value)}for value := range arr {//致谢一个返回值是索引fmt.Println(value)}

并且数组在go中也算值传递 传递的是数值

	arr1 := [...]int{10, 20, 30, 30, 30}arr2 := arr1arr2[0] = 100//若改变arr2的值  arr1的值也会改变 那就arr2是arr1的一个引用fmt.Println("arr1", arr1) //而java中数组是引用传递fmt.Println("arr2", arr2)fmt.Printf("arr1%p\n", &arr1) //而java中数组是引用传递fmt.Printf("arr2%p\n", &arr2)//输出结果只有2改变fmt.Println(arr1 == arr2) //false 如果改成一样的arr2[0] = 10fmt.Println(arr1 == arr2) //true 此时大小相同 容量相同是同一个数组

输出 改变赋值对象 原数组不会改变 并且输出地址也不想等
在这里插入图片描述

切片 (slice) 动态数组

和java中的list一样,为了解决数组大小固定 限制而决定的的数据结构 引用类型,引用类型如果只申明变量 (只有地址没有空间) 那么默认值都是nil(java中的null) 小提示:java中字符串是字符数组 而go中每个字符串是字符切片

申明方式
//申明数组时不写具体范围var splice []int //申明方式1for i := 0; i < 20; i++ {//早就草果范围但是底层扩容splice = append(splice, 4) //添加元素}

append 源码 传递指定的元素 或者其他切片… 返回该整合的新切片
在这里插入图片描述

融合其他切片

	splice1 = append(splice1, slice2...) //添加元素
//make 方式推荐//make 创建引用数据类型的切片 ,map,chanel/**make(type, len, cap)type:类型len:长度cap:容量细节 如果操作没有数据的索引会报错 比如 make([]string, 3, 10) 长度为3 容量为10 但是索引为4 就会报错 因为只有3个数据*/var list = make([]string, 0, 10) //对应ArrayList<string>// 创建一个字符串到整数的映射//dictionary := make(map[string]int)  对应new hashnap// 创建一个有缓冲区大小为5的整数通道//ch := make(chan int, 5)
从已有数组创建切片
	arrayy := [5]int{1, 2, 3, 4, 5}fmt.Println("从已有数组创建切片")slicedemo := arrayy[1:3] //从索引1到索引3的切片[:) 实际 0-2fmt.Println(slicedemo)//slice = append(slice, 6) //添加第6元素//slice = append(slice, 6) //添加第6元素//slice = append(slice, 6) //添加第6元素//slice = append(slice, 6) //添加第6元素fmt.Println("实际长度", len(slicedemo)) //fmt.Println("容量是", cap(slicedemo))  //从开始索引到末尾fmt.Printf("%p\n", &slicedemo)//俩个地址不一致 说明创建的切牌开启了新空间fmt.Printf("%p\n", &arrayy)
遍历 和数组一样 for 和foreach都可以
	//遍历切片 __表示临时变量只接受返回数据无法引用for _, v := range list {println(v)}
细节
	fmt.Println("detail 切片 map 通道都是引用类型变量赋值后修改变量原属性也会影响到其他变量")slice := []int{1, 2, 3, 4, 5}fmt.Println(slice)slice2 := sliceslice2[0] = 100 //修改的是切片2fmt.Println("修改切片2后原来的切片也会被修改")fmt.Println(slice[0])fmt.Println(slice)/**动态扩容的算法和java 一样一旦超过容量就扩容2倍*/fmt.Println("动态扩容的算法和java 一样一旦超过容量就扩容2倍,当前容量为5刚好填满", cap(slice))slice = append(slice, 6) //添加第6元素fmt.Println("添加第6元素后容量变为10,容量为2倍:", cap(slice))

说明是引用传递,修改传递的数据后,原来的数据也会被修改,并且扩容和java也是容量二倍扩容
在这里插入图片描述
但是类型还是数组go中表示切片也是底层是该类型切片的数组

var sli []int = make([]int, 0, 4)fmt.Printf("实际类型%T\n", sli)   

在这里插入图片描述

深拷贝实现

既然赋值方式是浅拷贝智能传递地址 那么手动实现深度拷贝

	slice := make([]int, 0, 10)for i := 0; i < cap(slice); i++ {slice = append(slice, rand.Intn(10))} //随机赋值10以内的元素var slice2 []intfor i := 0; i < len(slice); i++ {slice2 = append(slice2, slice[i])//slice2 = append(slice2, slice...)}fmt.Println("原始切片:", slice)fmt.Printf("克隆后的切片%p\n", &slice)fmt.Printf("克隆后的切片:%p\n", &slice2)

api方式 copy

	 var slice3 []int copy(slice3, slice)//截取某段数据[)copy(slice3, slice[2:])
//	返回复制的元素数

map 映射

和java一样也是一种key value的数据结构,无序 key 唯一

申明方式

引用类型创建前 没有申明空间会报错

	var address map[string]string = map[string]string{"localhost": "localhost","name": "上海",}

细节

	var address map[string]string//会报错 niladdress["John"] = "123 Main St"

在这里插入图片描述

	//只有申明了空间才可以操作var address map[string]string = map[string]string{}address["John"] = "123 Main St"

make(之前提到的 引用数据类型)

  	telebook := make(map[string]string)
//telebook["John"] = "123 Main St"telebook["Jane"] = "456 Oak Ave"

删除和获取当前长度

fmt.Print("当前映射的长度", len(telebook))delete(telebook, "John")//key如果不存在也不会报错fmt.Print("当前映射的长度", len(telebook))

遍历

	telebook := map[string]string{"坤哥": "有事打我电话","刀哥": "eqe芭蕾 eq一亏嘞","顶真": "我测尼玛",}for k, v := range telebook {fmt.Println(k, v)}//和遍历数组一样 数值在第二个for k := range telebook {//返回的是keyfmt.Println(k)}
map结合slice

打造 list 的效果

	//切片 一个map listuserinfos := make([]map[string]string, 0, 10)info := map[string]string{"name": "kong","age":  "25","sex":  "male",}userinfos = append(userinfos, info)userinfos = append(userinfos, userinfo)

注意因为(list) slice 是可以重复的有序的 所以可以添加多个同一个map
这样的化修改其中一个map 那么另外的也会被修改 因为是引用传递

userinfos = append(userinfos, userinfo)
userinfos = append(userinfos, userinfo)

在这里插入图片描述
所以如果要添加同样数据的map :=map {} 对应数据

channel

通道用于俩个携程之前进行通信

申明

	ch := make(chan int) 

使用

	// WaitGroup 用于等待一组 Goroutines 完成var wg sync.WaitGroupfor i := 0; i < 3; i++ {wg.Add(1) // 增加 WaitGroup 的计数go func(id int) {defer wg.Done()                             // 在函数返回时调用 Done 来通知 WaitGroup 该 Goroutine 完成了time.Sleep(time.Duration(id) * time.Second) // 延迟一定时间以模拟工作ch <- id                                    // 将当前的 id 发送到 Channel}(i) // 传入当前的 id 作为参数}// 启动一个 Goroutine 来接收数据go func() {wg.Wait() // 等待所有发送 Goroutine 完成close(ch) // 关闭 Channel}()// 从 Channel 中读取数据for value := range ch {fmt.Println("Received:", value)}

引用类型
影响范围:如果你复制了一个 channel 变量到另一个变量,两个变量实际上指向同一个 channel。因此,向一个变量代表的 channel 中发送数据或者从中接收数据,都会影响到另一个变量。这表明 channel 在赋值时表现得像引用类型。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源代码分享(33)-基于储能电站服务的冷热电多微网系统双层优化配置

参考文献&#xff1a; [1]吴盛军,李群,刘建坤,等.基于储能电站服务的冷热电多微网系统双层优化配置[J].电网技术,2021,45(10):3822-3832.DOI:10.13335/j.1000-3673.pst.2020.1838. 1.基本原理 随着储能技术的进步和共享经济的发展&#xff0c;共享储能电 站服务模式将成为未来…

【机器学习】GPT-4中的机器学习如何塑造人类与AI的新对话

&#x1f680;时空传送门 &#x1f50d;引言&#x1f4d5;GPT-4概述&#x1f339;机器学习在GPT-4中的应用&#x1f686;文本生成与摘要&#x1f388;文献综述与知识图谱构建&#x1f6b2;情感分析与文本分类&#x1f680;搜索引擎优化&#x1f4b4;智能客服与虚拟助手&#x1…

微信小程序 npm构建+vant-weaap安装

微信小程序&#xff1a;工具-npm构建 报错 解决&#xff1a; 1、新建miniprogram文件后&#xff0c;直接进入到miniprogram目录&#xff0c;再次执行下面两个命令&#xff0c;然后再构建npm成功 npm init -y npm install express&#xff08;Node js后端Express开发&#xff…

jenkins插件之Jdepend

JDepend插件是一个为构建生成JDepend报告的插件。 安装插件 JDepend Dashboard -->> 系统管理 -->> 插件管理 -->> Available plugins 搜索 Jdepend, 点击安装构建步骤新增执行shell #执行pdepend if docker exec phpfpm82 /tmp/composer/vendor/bin/pdepe…

用C语言实现扫雷

本篇适用于C语言初学者&#xff0c;主要涉及对于函数&#xff0c;数组&#xff0c;分支循环的运用。 目录 设计思想&#xff1a; 总代码&#xff08;改进后&#xff09;&#xff1a; 运行结果展示&#xff1a; 分布介绍&#xff1a; 声明&#xff1a; 代码主体部分&#…

ArcGIS JSAPI 学习教程 - ArcGIS Maps SDK for JavaScript - 框选显示高亮几何对象

ArcGIS JSAPI 学习教程 - ArcGIS Maps SDK for JavaScript - 框选显示高亮对象 核心代码完整代码&#xff1a;在线示例 在研究 ArcGIS JSAPI RenderNode 高亮&#xff08;highlights&#xff09;FBO 的时候&#xff0c;实现了一下框选高亮几何对象&#xff0c;这里分享一下。 …

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:隧道和矿井绘图设备

RockMass 正在努力打入采矿业和隧道工程利基市场。 这家位于多伦多的初创公司正在利用 NVIDIA AI 开发一款绘图平台&#xff0c;帮助工程师评估矿井和施工中的隧道稳定性。 目前&#xff0c;作为安全预防措施&#xff0c;地质学家和工程师会站在离岩石五米远的地方&#xff0…

chrome调试手机网页

前期准备 1、 PC端安装好chrmoe浏览器 2、 安卓手机安装好chrmoe浏览器 3、 数据线 原文地址&#xff1a;https://lengmo714.top/343880cb.html 手机打开调试模式 进入手机设置&#xff0c;找到开发者模式&#xff0c;然后启用USB调试 打开PC端chrome调试功能 1、点击chr…

聚焦Cayman 环二核苷酸(CDNs)

环二核苷酸CDNs 环二核苷酸&#xff08;cyclic dinucleotides&#xff0c;CDNs&#xff09;是一类天然的环状RNA分子&#xff0c;细菌衍生的CDNs分子包括c-di-GMP、c-di-AMP和3,3-cGAMP&#xff0c;它们介导对恶性、病毒性和细菌性疾病的先天免疫的保护作用&#xff0c;并在自…

springboot古诗文学习系统的设计与实现-计算机毕业设计源码91747

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;古诗文学习系统当然也不能排除在外。古诗文学习系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&am…

跨境反向海淘系统:业务流程解析与未来发展展望

随着全球化的深入发展和互联网技术的飞速进步&#xff0c;跨境购物已经成为越来越多消费者日常生活中的一部分。在这个过程中&#xff0c;反向海淘系统以其独特的优势&#xff0c;逐渐崭露头角&#xff0c;成为跨境电商领域的新星。作为一名在跨境反向海淘系统业务中耕耘了10年…

信创国产化 | 聚铭网络携手银河麒麟完成产品兼容性互认证

在我国信创国产化战略深入推进的大背景下&#xff0c;聚铭网络与麒麟软件积极响应国家号召&#xff0c;共同致力于软件和操作系统的国产化发展。近日&#xff0c;双方宣布已完成产品兼容性互认证工作&#xff0c;这一成果标志着两家公司在信创国产化道路上迈出了坚实的一步。 …

Acrobat Pro DC 2023 for Mac/Win:全平台PDF编辑器的终极解决方案

对于需要处理PDF文档的个人和企业用户来说&#xff0c;Adobe Acrobat Pro DC 2023是一款不可或缺的工具。作为全球领先的PDF编辑器&#xff0c;Acrobat Pro DC 2023在Mac和Windows平台上提供了丰富的功能和令人印象深刻的性能&#xff0c;使其成为用户编辑、转换和管理PDF文档的…

实验9 浮动静态路由配置

--名称-- 一、 原理描述二、 实验目的三、 实验内容四、 实验配置五、 实验步骤 一、 原理描述 浮动静态路由也是一种特殊的静态路由&#xff0c;主要考虑链路冗余。浮动静态路由通过配置一条比主路由优先级低的静态路由&#xff0c;用于保证在主路由失效的情况下&#xff0c;…

商城项目【尚品汇】07分布式锁-2 Redisson篇

文章目录 1 Redisson功能介绍2 Redisson在Springboot中快速入门&#xff08;代码&#xff09;2.1 导入依赖2.2 Redisson配置2.3 将自定义锁setnx换成Redisson实现&#xff08;可重入锁&#xff09; 3 可重入锁原理3.1 自定义分布式锁setnx为什么不可以重入3.2 redisson为什么可…

华为面经整理

文章目录 实习第一面准备提问相关算法相关 第一面结果提问环节 总结 实习 第一面准备 提问相关 操作系统有哪些功能 进程管理&#xff1a; 进程调度、进程同步和通信、多任务处理 内存管理&#xff1a; 内存分配、虚拟内存技术、内存保护 文件系统管理&#xff1a; 文件存储…

数据中心网络架构设计与优化

数据中心是现代企业和组织的核心基础设施&#xff0c;它们用于存储、处理和传输大量的数据和信息。为了满足不断增长的数据需求和提供可靠的服务&#xff0c;设计和优化数据中心网络架构至关重要。 首先&#xff0c;数据中心网络架构设计需要考虑可扩展性。随着业务的增长&…

【Pycharm】功能介绍

1.Code Reformat Code 格式化代码&#xff0c;可以帮助我们去自动调整空格等&#xff0c;根据python语法规范自动调整 2.Settings 1.创建py文件默认填充模版 3.读写py文件编码格式一致性 顶部代码指定的编码方式作用&#xff1a; 可以保证python2/3解释器在读取文件的时候按…

【SpringBoot + Vue 尚庭公寓实战】租期管理接口实现(四)

【SpringBoot Vue 尚庭公寓实战】租期管理接口实现&#xff08;四&#xff09; 文章目录 【SpringBoot Vue 尚庭公寓实战】租期管理接口实现&#xff08;四&#xff09;1、查询全部租期列表2、保存或更新租期信息3、根据ID删除租期 租期管理共有三个接口&#xff0c;分别是 保…

MySQL中获取时间的方法

大家好&#xff0c;在MySQL数据库开发中&#xff0c;获取时间是一个常见的需求。MySQL提供了多种方法来获取当前日期、时间和时间戳&#xff0c;并且可以对时间进行格式化、计算和转换。 以下是一些常用的MySQL时间函数及其示例&#xff1a; 1、NOW()&#xff1a;用于获取当前…