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;我们要来学习分支与循环结构中…

ffplay 命令行 从视频第N帧开始读取 ffmpeg 命令行 提取第N帧图片

ffmpeg中没有直接的命令读取第N帧 但是可以通过 t N/framerate 来获取到具体第N帧的时间 然后用 -ss t进行跳转。 比如帧率&#xff08;frame rate&#xff09;为24fps的视频G:/1/1.mp4文件从第1000帧开始进行播放&#xff0c;先计算出时间为 t 41.66666 ffplay -i G:/1/1.…

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

工具介绍 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…

科大讯飞前端面试题及参考答案 (下)

除了 echarts 还了解其它画图工具吗? 除了 Echarts,还有不少优秀的画图工具可供选择使用。 Highcharts:它是一款功能强大且应用广泛的图表绘制工具,支持多种常见的图表类型,像柱状图、折线图、饼图、散点图等,同时也能创建较为复杂的图表,比如仪表盘图表、极坐标图等。H…

【HarmonyOS Next NAPI 深度探索2】N-API 的工作机制与架构

【HarmonyOS Next NAPI 深度探索2】N-API 的工作机制与架构 如果你听说过 N-API&#xff0c;但还不太了解它的作用和背后的工作机制&#xff0c;那这篇文章会帮你捋清楚它的结构和原理。N-API 是 Node.js 提供的一个强大工具&#xff0c;专门用于开发高性能、可维护的原生模块…

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

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

14综合面试篇(综合面试题)

目录 一、关于null的问题 二、springboot jar启动参数的配置linux Xms Xmx 三、java -jar 启动参数问题 四、 java打一个jar包放到linux服务器上&#xff0c;这种默认参数的启动&#xff0c;是怎么知道分配原则和配置原则? 五、Linux系统下jar包自启动 六、i&#xff0c;…

机器学习算法(三):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…

写个自己的vue-cli

写个自己的vue-cli 1.插件代码2. 发布流程3. 模板代码讲解3.1 vue2模板的运行流程:3.2 vue3模板的运行流程: 1.插件代码 写一个自己的vue-cli插件 插件地址&#xff1a;插件地址 流程&#xff1a; 实现简单版 vue-cli 步骤文档1. 项目初始化 - 创建项目文件夹 qsl-vue-cli - …

leetcode热门100题1-4

第一天 两数之和 //暴力枚举 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {int n nums.size();for (int i 0; i < n; i) {for (int j i 1; j < n; j) {if (nums[i] nums[j] target) {return {i, j};}}}return {…

数据结构初阶---排序

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