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.mzph.cn/bicheng/23363.shtml

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

相关文章

MDK(μVsion3)问题总结及解决方法

问题 1&#xff1a;MDK 工具的 CARM 编译器&#xff1f; 我原来对 CARM 编译器比较熟悉&#xff0c;想用 CARM 编译器编译工程&#xff0c;但是却弹出一个不能执 行“cc”的错误&#xff0c;到 KEIL 网站查下才知道原因&#xff1a;由于 CARM 编译器是比较老的编译器&#xff0…

java之基础2笔记

1 类型转换 1.1 自动类型转换&#xff08;隐式类型转换&#xff09; 从小的数据类型到大的数据类型的转换&#xff08;如 int 到 long&#xff09;。 从低精度的数据类型到高精度的数据类型的转换&#xff08;如 float 到 double&#xff09;。 1.2 强制类型转换&#xff0…

什么是接地电阻柜呢?

接地电阻柜是一种用于保护电气设备和人身安全的设备&#xff0c;它可以有效地防止电气设备因接地故障而受到损害。 接地电阻柜的主要作用是将电气设备的接地电阻降低到安全范围内&#xff0c;以防止接地故障引起的火灾、爆炸等事故。接地电阻柜通常由接地电阻、接地母线、接地开…

pytest中钩子函数的使用

收集测试结果&#xff1a; 2. pytest_terminal_summary(terminalreporter, exitstatus,config) 在测试执行完毕后&#xff0c;用于生成并显示最终的测试摘要信息到终端&#xff0c;你可以实现自定义的测试报告汇总和显示。 例如&#xff1a;你可以在此钩子函数中计算测试用例…

TypeScript基础语法和使用规则+对象初始化

TypeScript (TS) 是一种由微软开发的开源语言&#xff0c;它是 JavaScript 的一个超集&#xff0c;添加了可选的静态类型和基于类的面向对象编程。它旨在开发大型应用程序并将 JavaScript 编译成清晰和简洁的代码。 一、基础语法和使用规则 1. 类型注解 类型注解是 TypeScri…

关于Apache Tomcat请求走私漏洞(CVE-2023-46589)

一、 基本情况 Apache Tomcat是一个流行的开源Web服务器和Java Servlet容器。 二、 漏洞描述 Apache Tomcat中修复了一个请求走私漏洞&#xff08;CVE-2023-46589&#xff09;。 由于Tomcat未能正确解析HTTP Trailer标头&#xff0c;超出标头大小限制的特制Trailer标头可能…

儿童护眼灯哪个好?带你了解适合儿童的护眼灯款式分享

儿童护眼灯哪个好&#xff1f;作为我们日常生活中极为实用的小家电&#xff0c;为了确保使用台灯时的舒适性并且保护视力&#xff0c;选择一款专业的护眼台灯成为了一个明智的决定。这样的台灯能够提供更舒适、均匀的照明环境&#xff0c;那么到底儿童护眼灯哪个好你&#xff1…

实现手机空号过滤或手机号码有效性验证

手机空号过滤或手机号码有效性验证通常涉及使用专门的API接口来查询手机号码的状态。这些API接口通常由第三方服务提供商提供&#xff0c;它们会与电信运营商合作或利用自己的数据库来验证手机号码是否真实存在、是否已被分配、是否处于空号状态等。 以下是一些步骤和考虑因素…

关于我做了一个python项目的总结

前言: 首先,我通过python的爬虫技术做了一个关于音乐的项目,实现的功能有搜索音乐,输出歌词,保存歌词,下载音乐 项目构思: 在刚开始时,首先是构思,构思自己要去做哪个方面的,并且要怎么去实现我想实现的功能,然后我就想到要去做一个关于音乐方面的 项目实现: 确定了自己的方向…

爬虫——有道云翻译

废话不多说直接上代码 固定文本内容 import timefrom selenium import webdriver from selenium.common.exceptions import NoSuchElementException, TimeoutException from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWai…

Day 41 NGINX详解

Nginx详解 一、HTTP协议 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 1、HTTP 工作原理 HTTP协议通信流程 WEB Server&…

超维小课堂 | 6、MAVROS与机载电脑Jetson nano通信

MAVROS与机载电脑Jetson nano通信 ROS系统镜像——Jetson nano b01 4G 链接: 百度云镜像链接 链接&#xff1a;https://pan.baidu.com/s/1NoIEvVdsiYLPvVOWM98hjQ 提取码&#xff1a;cwkj 简介&#xff1a;MAVROS和Jetson nano通信&#xff0c;设置飞控参数和MAVROS文件&am…

Starlette

Starlette是一个轻量级的ASGI框架和工具包&#xff0c;主要用于构建高性能的asyncio服务。它具备以下特点&#xff1a; 轻量级HTTP Web框架&#xff1a;Starlette提供了一个简单且复杂度低的HTTP Web框架。WebSocket支持&#xff1a;允许在应用中实现WebSocket功能。后台任务&…

程序猿大战Python——了解Python

了解Python 编程语言的发展 目标&#xff1a;了解编程语言。 我们知道&#xff0c;咱们的日常沟通交流使用的语言&#xff1a;普通话。 那什么是编程语言呢&#xff1f; 【官方解释】编程语言是用来定义程序的语言形式&#xff0c;也就是说&#xff0c;我们可以通过编程语言…

学习使用js监测浏览器窗口大小变化

学习使用js监测浏览器窗口大小变化 在JavaScript中&#xff0c;可以通过监听resize事件来检测浏览器窗口的大小变化。以下是一个简单的示例代码&#xff0c;用于检测浏览器窗口大小的变化并在控制台输出新的窗口尺寸&#xff1a; javascript // 定义一个处理窗口大小变化的函数…

el-table后台接口返回数据动态合并单元格

在实际工作中&#xff0c;通常数据都是后台接口返回的&#xff0c;有时需要对数据进行合并&#xff0c;可利用el-table的span-method方法&#xff0c;结合数据处理&#xff0c;进行合并&#xff0c;如下实例 <el-table :data"dataTable"borderrow-key"id&qu…

root账号,cmd命令行能用ssh连上服务器,但是vscode连接报错Permission denied,please try again

☆ 问题描述 但是cmd能连接上 ★ 解决方案 点击 然后add到自己的配置文件下 重新选择 这个时候就会出现刚刚添加的&#xff0c;点击选择 输入密码 然后就ok了 ✅ 总结 只能说&#xff1a;玄学&#xff01;

剪画小程序:自媒体必备神器:【视频翻译】自动识别语言、翻译、配音,让外语视频秒变母语!

Hello&#xff0c;大家好呀&#xff01;我是不会画画的小画~ 今天给大家带来一款敲实用的视频翻译工具一一 小程序【剪画】 我们有很小伙伴在学习他国语言时&#xff0c;最大的障碍就是语言的问题了&#xff0c;想要 理解其中的内容&#xff0c;在这之前要下很大的功夫去掌握…

创业新风口:智能售货机的崛起

随着科技的飞速发展&#xff0c;智能售货机已经不再是简单的自动贩卖机&#xff0c;它们变得更加智能、灵活&#xff0c;能够适应各种场景需求&#xff0c;从传统的饮料、零食到新鲜水果、便当、甚至是电子产品&#xff0c;无所不包。这种24小时无人值守的商业模式&#xff0c;…

居民社区团购小程序源码系统 拼团管理+团长管理功能 带完整的安装代拿代码包以及搭建教程

系统概述 居民社区团购小程序源码系统是一款专为社区团购打造的一站式解决方案。它整合了拼团管理和团长管理等核心功能&#xff0c;能够帮助企业和创业者快速搭建自己的社区团购平台&#xff0c;实现高效运营和便捷管理。 代码示例 系统特色功能 1.拼团管理&#xff1a;支持…