Golang学习历程【第六篇 复合数据类型map函数初识】

Golang学习历程【第六篇 复合数据类型map&函数初识】

  • 1. Map数据类型
    • 1.1. Map声明和初始化
    • 1.2. Map 遍历
    • 1.3 Map增删改查
  • 2. function (函数)
    • 2.1 函数各种定义方式

1. Map数据类型

Map结构是键值对的集合,其中每个键都是唯一的,并且每个键都映射到一个值。
Map是无序的,即元素的顺序是不确定的。
Map的初始值是nil,不能直接使用,需要使用make函数来创建一个Map。
Map结构为引用数据类型

1.1. Map声明和初始化

// Map的声明,其中keyType是键的类型,valueType是值的类型
// 1. 先声明 var 变量名 map[keyType]valueType
var map1 map[string]int
// 2. 使用make函数来创建一个Map
map1 = make(map[string]int)
map1["a"] = 1
map1["b"] = 2
map1["c"] = 3
// 2. 声明即创建 ,并赋值 var 变量名 = make(map[keyType]valueType)
var map2 = make(map[string]int)
map2["a"] = 4
map2["b"] = 5
map2["c"] = 6
// 3. 简短声明 变量名 := map[keyType]valueType
map3 := map[string]int{}
map3["a"] = 7
map3["b"] = 8
map3["c"] = 9
// 4. 声明即创建,并赋值
var map4 = map[string]int{"a": 10, "b": 11, "c": 12}
// 5. 简短声明,并赋值
map5 := map[string]int{"a": 13, "b": 14, "c": 15}
// 6. 声明一个map和定义一个map,其值的区别
var map6 map[string]int
var map7 = map[string]int{}
fmt.Printf("map1 类型:%T 值:%v map1 是否为 nil %v \n", map1, map1, map1 == nil)
fmt.Printf("map2 类型:%T 值:%v map2 是否为 nil %v \n", map2, map2, map2 == nil)
fmt.Printf("map3 类型:%T 值:%v map3 是否为 nil %v \n", map3, map3, map3 == nil)
fmt.Printf("map4 类型:%T 值:%v map4 是否为 nil %v \n", map4, map4, map4 == nil)
fmt.Printf("map5 类型:%T 值:%v map5 是否为 nil %v \n", map5, map5, map5 == nil)
fmt.Printf("map6 类型:%T 值:%v map6 是否为 nil %v \n", map6, map6, map6 == nil) // map6 是 nil,不能使用,因为仅做了声明,没有初始化
fmt.Printf("map7 类型:%T 值:%v map7 是否为 nil %v \n", map7, map7, map7 == nil) // map7 是一个空的map,可以正常使用
/*** Map获取长度函数 len(),结果为键值对个数*/
map8 := map[string]string{"one":   "java","two":   "python","three": "go",
}fmt.Println(len(map1))/*** 以上运行结果* map1 类型:map[string]int 值:map[a:1 b:2 c:3] map1 是否为 nil false* map2 类型:map[string]int 值:map[a:4 b:5 c:6] map2 是否为 nil false* map3 类型:map[string]int 值:map[a:7 b:8 c:9] map3 是否为 nil false* map4 类型:map[string]int 值:map[a:10 b:11 c:12] map4 是否为 nil false* map5 类型:map[string]int 值:map[a:13 b:14 c:15] map5 是否为 nil false* map6 类型:map[string]int 值:<nil> map6 是否为 nil true* map7 类型:map[string]int 值:map[] map7 是否为 nil false* 3*/

1.2. Map 遍历

/*** Map的遍历*/
map1 := map[string]string{"one":   "java","two":   "python","three": "go",
}
// 1. fori遍历方式
fmt.Println("1. fori遍历方式")
keys := make([]string, 0, len(map1))
for k := range map1 {keys = append(keys, k)
}
for i := 0; i < len(keys); i++ {fmt.Printf("key=%v value=%v\n", keys[i], map1[keys[i]])
}
// 2. forrange遍历方式
fmt.Println("2. forrange遍历方式")
for k, v := range map1 {fmt.Printf("key=%v value=%v\n", k, v)
}
/*** 结果:* 1. fori遍历方式* key=one value=java* key=two value=python* key=three value=go* 2. forrange遍历方式* key=one value=java* key=two value=python* key=three value=go*/

1.3 Map增删改查

map1 := map[string]string{"one":   "java","two":   "python","three": "go",
}// map的增删改查
// 增
map1["four"] = "php"
fmt.Printf("map1: %v\n", map1)
// 删
delete(map1, "one")
fmt.Printf("map1: %v\n", map1)
// 改
map1["two"] = "c++"
// 查
value, ok := map1["two"] // ok为true表示存在,为false表示不存在
if ok {fmt.Println(value)
}
value1, ok1 := map1["five"] // ok为true表示存在,为false表示不存在
if ok1 {fmt.Println(value1)
} else {fmt.Println("five不存在")
}
/** 结果* map1: map[four:php three:go two:python]* map1: map[three:go two:python]* c++* five不存在*/

2. function (函数)

函数是一段可重复使用的代码块,用来完成特定的功能

函数的特点有下:

  1. 函数的作用:提高代码的复用性,提高代码的可读性,提高代码的维护性
  2. .】函数的返回值:函数的返回值是通过return语句来实现的,return语句可以返回一个值,也可以返回多个值
  3. 函数的参数:函数的参数是通过函数的参数列表来实现的,参数列表中的参数可以是任意类型,参数列表中的参数可以是任意个数
  4. 函数变量作用域:函数变量作用域是指在函数内部定义的变量,该变量只能在函数内部使用,函数外部无法访问该变量
  5. 函数的返回值和参数列表:函数的返回值和参数列表是函数的组成部分,函数的返回值和参数列表是函数的输出和输入,函数的返回值和参数列表是函数的接口,函数的返回值和参数列表是函数的契约

2.1 函数各种定义方式

package mainimport "fmt"/** 函数初识什么是函数:函数是一段可重复使用的代码块,用来完成特定的功能函数的作用:提高代码的复用性,提高代码的可读性,提高代码的维护性函数的定义:func 函数名(参数列表) 返回值列表 {函数体}函数的调用:函数名(参数列表)函数的返回值:函数的返回值是通过return语句来实现的,return语句可以返回一个值,也可以返回多个值函数的参数:函数的参数是通过函数的参数列表来实现的,参数列表中的参数可以是任意类型,参数列表中的参数可以是任意个数函数的返回值和参数列表:函数的返回值和参数列表是函数的组成部分,函数的返回值和参数列表是函数的输出和输入,函数的返回值和参数列表是函数的接口,函数的返回值和参数列表是函数的契约*
*/
// 函数定义
// func 函数名(参数列表) 返回值列表 {
// 	函数体
// }
/** 1. 无参数无返回值*/
func sayHello() {fmt.Println("hello world")
}/** 2. 有参数无返回值* @param name string*/
func sayHello2(name string) {fmt.Println("hello", name)
}/*** 2. 有参数有返回值* @param a int* @param b int* @return int*/
func add(a int, b int) int {return a + b
}/** 3. 省略参数类型,此时a的类型与b的类型保持一致* @param a int* @param b int* @return int*/
func add2(a, b int) int {return a + b
}/*** 4. 省略返回值,此时函数的返回值类型为int* @param a int* @param b int* @return int*/
func add3(a, b int) (c int) { // c := a + bc = a + breturn // return c
}/*** 5. 多个返回值* @param a int* @param b int* @return int 之和* @return int 之差*/
func add4(a, b int) (int, int) {return a + b, a - b
}/*** 6. 命名返回值* @param a int* @param b int* @return int 之和* @return int 之差*/
func add5(a, b int) (sum, diff int) {sum = a + bdiff = a - breturn
}/*** 7. 可变参数* @param a ...int* @return int*/
func add6(a ...int) int {sum := 0for _, v := range a {sum += v}return sum
}/*** 8. 函数做形参* @param a int* @param b int* @param op func(int, int) int 表示参数为一个函数,该函数接收两个int类型的参数,返回一个int类型的值*/
func opreate(a, b int, op func(int, int) int) int {return op(a, b) // 调用函数
}/*** 9. 函数做返回值* @param a int* @param b int* @return func() string*/
func add7(a, b int) func() string {// 内部定义一个函数f := func() string {return fmt.Sprintf("%d + %d = %d", a, b, a+b) // 返回一个字符串} // 这里只是定义函数,没有调用函数,调用函数需要使用f()return f // 返回函数
}/*** 10. 匿名函数* 解释:匿名函数是没有名字的函数,匿名函数可以赋值给变量,也可以直接调用** @param a int 数值1* @param b int 数值2* @return func() string 返回类型为一个函数,该函数返回类型为string*/
func add8(a, b int) func() string {return func() string { // 匿名函数的定义,没有函数名return fmt.Sprintf("%d + %d = %d", a, b, a+b) // 返回一个字符串} // 匿名函数的调用
}// main函数 入口函数
func main() {sayHello()sayHello2("张三")fmt.Printf("add %d\n", add(1, 2))fmt.Printf("add2 %d\n", add2(3, 4))fmt.Printf("add3 %d\n", add3(5, 6))sum1, diff1 := add4(7, 8)fmt.Printf("add4 %d %d\n", sum1, diff1)sum2, diff2 := add5(9, 10)fmt.Printf("add5 %d %d\n", sum2, diff2)fmt.Printf("add6 %d\n", add6(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))fmt.Printf("opreate %d\n", opreate(1, 2, add))fmt.Printf("opreate %d\n", opreate(2, 4, func(i1, i2 int) int { // 自定义匿名函数做参数return i1 * i2 // 返回两个数的乘积}))fmt.Printf("add7 %s\n", add7(1, 2)())fmt.Printf("add8 %s\n", add8(3, 4)())/*** 以上运行结果:* hello world* hello 张三* add 3* add2 7* add3 11* add4 15 -3* add5 19 -1* add6 55* opreate 3* opreate 8* add7 1 + 2 = 3* add8 3 + 4 = 7*/
}

上一篇:Golang学习历程【第五篇 复合数据类型:数组&切片】
下一篇:Golang学习历程【第七篇 闭包&type defer panic recover了解&time包】 待续中。。。

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

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

相关文章

《框架程序设计》期末复习

目录 Maven 简介 工作机制&#xff08;★&#xff09; 依赖配置&#xff08;★&#xff09; Maven命令 MyBatis 入门 单参数查询&#xff08;★&#xff09; 多参数查询&#xff08;★★★&#xff09; 自定义映射关系&#xff08;★★★&#xff09; 基本增删改查操…

于交错的路径间:分支结构与逻辑判断的思维协奏

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。* 这一节内容很多&#xff0c;文章字数达到了史无前例的一万一&#xff0c;我们要来学习分支与循环结构中…

计算机图形学【绘制立方体和正六边形】

工具介绍 OpenGL&#xff1a;一个跨语言的图形API&#xff0c;用于渲染2D和3D图形。它提供了绘制图形所需的底层功能。 GLUT&#xff1a;OpenGL的一个工具库&#xff0c;简化了窗口创建、输入处理和其他与图形环境相关的任务。 使用的函数 1. glClear(GL_COLOR_BUFFER_BIT |…

探秘block原理

01 概述 在iOS开发中&#xff0c;block大家用的都很熟悉了&#xff0c;是iOS开发中闭包的一种实现方式&#xff0c;可以对一段代码逻辑进行封装&#xff0c;使其可以像数据一样被传递、存储、调用&#xff0c;并且可以保存相关的上下文状态。 很多block原理性的文章都比较老&am…

vue3+ts+element-plus 对话框el-dialog设置圆角

对话框el-dialog设置圆角&#xff0c;实现的需求效果&#xff1a; 目前只能通过行内样式&#xff08;style"border-radius: 20px"&#xff09;来实现圆角效果&#xff1a;

机器学习算法(三):K近邻(k-nearest neighbors)

1 KNN的介绍和应用 1.1 KNN的介绍 kNN(k-nearest neighbors)&#xff0c;中文翻译K近邻。我们常常听到一个故事&#xff1a;如果要了解一个人的经济水平&#xff0c;只需要知道他最好的5个朋友的经济能力&#xff0c; 对他的这五个人的经济水平求平均就是这个人的经济水平。这…

大语言模型兵马未动,数据准备粮草先行

​从OpenAI正式发布ChatGPT开始&#xff0c;大型语言模型&#xff08;LLM&#xff09;就变得风靡一时。对业界和吃瓜群众来说&#xff0c;这种技术最大的吸引力来自于理解、解释和生成人类语言的能力&#xff0c;毕竟这曾被认为是人类独有的技能。类似CoPilot这样的工具正在迅速…

Network Compression(李宏毅)机器学习 2023 Spring HW13 (Boss Baseline)

1. Introduction to Network Compression 深度学习中的网络压缩是指在保持神经网络性能的同时,减少其规模的过程。这非常重要,因为深度学习模型,尤其是用于自然语言处理或计算机视觉的大型模型,训练和部署的计算成本可能非常高。网络压缩通过降低内存占用并加快推理速度,…

UnityDots学习(二)

在一里已经概述了什么是Dots&#xff0c;已经如果使用它&#xff0c;我们要做的思维转变。 简单总结下&#xff1a; Dots使用了计算器多核&#xff0c;已经3级缓存的优势&#xff0c;在此基础上使用Brust编译器对各个平台实现了代码优化。从而达到了加速提升的效果。 我们要…

Linux (CentOS) 安装 Docker 和 Docker Compose

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 欢迎点赞 &#x1f44d; 收藏 ⭐评论 …

c++ 预备

目录 前言 一&#xff0c;知识点的补充 二&#xff0c;c语言与c 三&#xff0c;面向对象的三大特点 前言 将进入c的学习&#xff0c;接下来是对于c的预备和c的一些预习 一&#xff0c;知识点的补充 1 标识符 标识符不能为关键字 标识符只能由下划线&#xff0c;数字&#xf…

SpringBoot项目实战(41)--Beetl网页使用自定义函数获取新闻列表

在Beetl页面中可以使用自定义的函数从后台新闻列表中获取新闻数据展示到页面上。例如我们可以从后台新闻表中获取新闻按照下面的格式展示&#xff1a; <li><a href"#">东亚非遗展即将盛妆亮相 揭起盖头先睹为快</a></li><li><a hre…

从零开始开发纯血鸿蒙应用之多签名证书管理

从零开始开发纯血鸿蒙应用 一、前言二、鸿蒙应用配置签名证书的方式1、自动获取签名证书2、手动配置签名证书 三、多签名证书配置和使用四、多证书使用 一、前言 由于手机操作系统&#xff0c;比电脑操作系统脆弱很多&#xff0c;同时&#xff0c;由于手机的便携性&#xff0c…

数据结构初阶---排序

一、排序相关概念与运用 1.排序相关概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的…

系统看门狗配置--以ubuntu为例

linux系统配置看门狗 以 ubuntu 系统配置看门狗为例 配置看门狗使用的脚本文件&#xff0c;需要使用管理员权限来执行&#xff1a; 配置是&#xff1a;系统每 30S 喂一次狗&#xff0c;超过 60S 不进行投喂&#xff0c;就会自动重启。 1. 系统脚本内容&#xff1a; #!/bin/b…

opencv的NLM去噪算法

NLM&#xff08;Non-Local Means&#xff09;去噪算法是一种基于图像块&#xff08;patch&#xff09;相似性的去噪方法。其基本原理是&#xff1a; 图像块相似性&#xff1a;算法首先定义了一个搜索窗口&#xff08;search window&#xff09;&#xff0c;然后在该窗口内寻找…

Docker运维高级容器技术知识点总结

1、虚拟机部署和容器化部署的区别是什么&#xff1f; 1、技术基础&#xff1a; <1>.虚拟化技术在物理硬件上创建虚拟机&#xff0c;每台虚拟机运行自己完整的操作系统、从而实现资源隔离。 <2>.容器化技术&#xff1a;将应用程序打包在容器内&#xff0c;在进程空间…

双模充电桩发展前景:解锁新能源汽车未来的金钥匙,市场潜力无限

随着全球能源转型的浪潮席卷而来&#xff0c;新能源汽车行业正以前所未有的速度蓬勃发展&#xff0c;而作为其坚实后盾的充电基础设施&#xff0c;特别是双模充电桩&#xff0c;正逐渐成为推动这一变革的关键力量。本文将从多维度深入剖析双模充电桩的市场现状、显著优势、驱动…

python3GUI--大屏可视化-传染病督导平台 By:PyQt5

文章目录 一&#xff0e;前言二&#xff0e;预览三&#xff0e;软件组成&开发心得1.样式&使用方法2.左侧表格实现3.设计4.学习5.体验效果 四&#xff0e;代码分享1.环形渐变进度组件2.自定义图片的背景组件 五&#xff0e;总结 大小&#xff1a;60.9 M&#xff0c;软件…

某漫画网站JS逆向反混淆流程分析

文章目录 1. 写在前面1. 接口分析2. 反混淆分析 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Pyth…