Golang学习之路3-基础认识(下)

news/2024/4/28 2:11:24/文章来源:https://blog.csdn.net/qq_42675140/article/details/127602442

文章目录

  • 前言
  • 一、数组
    • 1.定长数组
    • 2.不定长数组
  • 二、map
    • 1.使用关键字 map 来声明
    • 2.使用 make 来声明
    • 3.添加元素
    • 4.检索key的value是否存在
    • 5.删除元素
    • 6.遍历map
    • 7.map的注意点
    • 在这里插入图片描述
  • 三、指针
    • 1.使用指针& 及 *
    • 2.空指针
  • 四、循环与条件判断
    • 1.循环
    • 2.条件判断


前言

学习一门语言,先认识下Golang的基础语法,例如变量定义、数据类型等等。


一、数组

1.定长数组

1)定长数组 (5容量)
nums := [5]string{“aa”, “bb”, “cc”}
2)遍历数组,方式一
3)遍历数组,方式二 (常用)

package mainimport "fmt"func main1() {// 定长数组 (5容量)names := [5]string{"aa", "bb", "cc"}names[3] = "dd"// 遍历数组,方式一for i := 0; i < len(names); i++ {fmt.Println(names[i])}// 遍历数组,方式二 (常用)for key, value := range names {// 可忽略key使用下划线如:for _, value := range names {fmt.Println(key, value)}// 忽略两个需要用=而不能使用:= 如:for _, _ = range names
}

在这里插入图片描述

2.不定长数组

1)不定长数组:

names := []string{"aa", "bb", "cc"}

2)追加数据重新赋值会给自己
cap:查看容量,如果容量不足,会动态扩充容量正常是当前容量的2倍

names = append(names, "dd")

3) 数组切片,左闭右开

// 打印 0-1 索引的数据
fmt.Println(names[:2])
// 打印 1-2 索引的数据
fmt.Println(names[1:3])
// 打印 2-n 索引的数据
fmt.Println(names[2:])

4)创建指定长度及指定容量的数组

// 创建指定长度及指定容量的数组
names2 := make([]string, 10, 50)
names2[0] = "a"

5)如果数组切片赋值,不共享数据则使用:copy

// 基于以上,如果不共享数据则使用:copy
namesList := []string{"aa", "bb"}
copyList := make([]string, 2, 50)
copy(copyList, namesList)
fmt.Println("修改前:", namesList, copyList)
namesList[0] = "cc"
fmt.Println("修改后:", namesList, copyList)

在这里插入图片描述
完整代码:

package mainimport "fmt"func main() {// 不定长数组names := []string{"aa", "bb", "cc"}fmt.Println("追加前的容量:", cap(names))// 追加数据重新赋值会给自己names = append(names, "dd")fmt.Println("追加后的容量:", cap(names))// 数组切片&创建新数组,左闭右开names1 := names[:2] // 建新数组,数据共享的fmt.Println(names1)names[0] = "修改后的"fmt.Println(names1)names = append(names, "追加数据不共享AA")fmt.Println(names, names1)// 基于以上,如果不共享数据则使用:copynamesList := []string{"aa", "bb"}copyList := make([]string, 2, 50)copy(copyList, namesList)fmt.Println("修改前:", namesList, copyList)namesList[0] = "cc"fmt.Println("修改后:", namesList, copyList)// 创建指定长度及指定容量的数组names2 := make([]string, 10, 50)names2[0] = "a"
}

二、map

map 一种无序的键值对, 它是数据结构 hash 表的一种实现方式。map工作方式就是:定义键和值(key、value),并且可以获取,设置和删除其中的值。

1.使用关键字 map 来声明

names := map[string]string{“key”: “value”}

// 使用关键字 map 来声明
names := map[string]string{"ppl": "yes", "gsxl": "no"}
for key, value := range names {fmt.Println(key, value)
}

2.使用 make 来声明

// 使用make来声明
mapAge := make(map[string]int)

3.添加元素

// 赋值:key=ppl value=18
mapAge["ppl"] = 18

4.检索key的value是否存在

检索不到默认返回0

// 检索key的value
age, ok := mapAge["ppl"]
if ok {fmt.Println("age:", age)
}
// 检索不到返回0
age, ok := mapAge["ppl1"]

5.删除元素

函数没有返回值

// 删除map的key:value,不存在也不会报错,存在则删除
delete(names, "gsxl")
fmt.Println(names)

6.遍历map

for key, value := range names {}

names := map[string]string{"ppl": "yes", "gsxl": "no"}
for key, value := range names {fmt.Println(key, value)
}

7.map的注意点

  • map是引用类型,当map赋值给一个新变量指针是指向同一个内部数据结构,因此任一改变另一跟随改变
  • 须指定 key, value 的类型,且数据类型必须与定义一致
  • 无序性,key唯一性
  • value可以为任意类型
  • key可以为基础数据类型(例如 bool, 数字类型,字符串), 不能为数组,切片,map,它的取值必须是能够使用 == 进行比较
  • 线程不安全, 写入并发时(goroutine)需要加锁,另外也不能并发的读写,否则错误

完整代码:

package mainimport "fmt"func main() {// 使用关键字 map 来声明names := map[string]string{"ppl": "yes", "gsxl": "no"}for key, value := range names {fmt.Println(key, value)}// 使用make来声明mapAge := make(map[string]int)// 赋值:key=ppl value=18mapAge["ppl"] = 18// 检索key的valueage, ok := mapAge["ppl1"]if ok == false {fmt.Println("age:", age)}// 删除map的key:valuedelete(names, "gsxl")fmt.Println(names)
}

在这里插入图片描述

三、指针

什么是指针?
一个指针变量指向了一个值的内存地址,内部垃圾回收机制(gc)。

1.使用指针& 及 *

  • 变量指针存储地址:&name
  • 使用指针访问值:*ptr
// 声明实际变量
name := "ppl"
// 声明指针变量且存储地址=&name
ptr := &name
fmt.Println("name:", name)
fmt.Println("name ptr:", ptr)
fmt.Println("name ptr使用指针访问值:", *ptr)

2.空指针

空指针:nil,既空值如Python的None,mysql的null

// 空指针:nil,既空值如Python的None,mysql的null
var ptrNil *string
// 指针做判断 != 与 ==
if ptrNil == nil {fmt.Println("ptrNil:", ptrNil)
}

完整代码

package mainimport "fmt"func main() {// 声明实际变量name := "ppl"// 声明指针变量且存储地址=&nameptr := &namefmt.Println("name:", name)fmt.Println("name ptr:", ptr)fmt.Println("name ptr使用指针访问值:", *ptr)// 使用new关键字定义name1 := new(string)*name1 = "ppl"fmt.Println(name1)fmt.Println(*name1)fmt.Println("strPtr():", strPtr(*name1))// 空指针:nil,既空值如Python的None,mysql的nullvar ptrNil *string// 指针做判断 != 与 ==if ptrNil == nil {fmt.Println("ptrNil:", ptrNil)}
}func strPtr(str string) *string {// 返回 string 的指针return &str
}

四、循环与条件判断

1.循环

1.1 for循环
for循环是go语言唯一能使用的循环语句,其它语言还会存在 while 循环…

func main() {// for循环for i := 0; i < 5; i++ {fmt.Println(i)}
}

1.2break语句
结束当前整个for循环,多个for循环时便是结束当前for循环代码块

func main() {// for循环for i := 0; i < 5; i++ {fmt.Println("i:", i)// break结束循环if i == 2 {break}}
}

1.3continue语句
仅跳过本次循环,继续下次循环

func main() {// for循环for i := 0; i < 5; i++ {// continue跳过当前循环,继续下次循环if i == 1 {fmt.Println("continue进入下次循环,不在执行下面代码")continue}}
}

完整代码:

package mainimport "fmt"func main() {// for循环for i := 0; i < 5; i++ {// 仅跳过本次循环,继续下次循环if i == 1 {fmt.Println("continue进入下次循环,不在执行下面代码")continue}fmt.Println("i:", i)// break结束循环if i == 2 {break}for j := 0; j < 5; j++ {if j == 0 {fmt.Println("跳出嵌套的for循环代码块")break}fmt.Println("被上面break,下面条件永远不可能满足...")}}
}

在这里插入图片描述

2.条件判断

if是一个具有布尔条件的语句,如果该条件为真,则执行第一个代码块。如果条件求值为false,则执行另一个else块。
1.条件判断 if else

// 条件判断 if else
age := 18
if age >= 18 { // age >=18 为条件fmt.Println("age is >= 18")
} else {fmt.Println("age is < 18")
}

2.且与或

  • &&:且,需要同时满足条件
  • ||:或,满足其中一个条件即可
age := 18
// &&:且,需要同时满足条件
if age > 16 && age < 20 {fmt.Println("ge > 16 且 age < 20, result age is:", age)
} else if age > 22 {fmt.Println("age is >22")
} else {fmt.Println("age is <16 or > 22")
}
// ||:或,满足其中一个条件即可
if age > 20 || age == 18 {fmt.Println("age is >20 or ==18")
}

3.switch条件语句
1)switch条件语句,匹配后默认break(可写多个条件)

// switch条件语句,匹配后默认break(可写多个条件)
number := 18
switch number {
case 12, 13:fmt.Println("The is 12, 13")
case 18:fmt.Println("The is 18")
default:fmt.Println("The is default")
}

2)switch还可以使用类似 if else

// switch还可以使用类似 if else
switch {
case number >= 16 && number <= 25:fmt.Println("The is >=16 and <=25")
default:fmt.Println("switch default")
}

完整代码:

package mainimport "fmt"func main() {// 条件判断 if elseage := 18if age >= 18 { // age >=18 为条件fmt.Println("age is >= 18")} else {fmt.Println("age is < 18")}// &&:且,需要同时满足条件if age > 16 && age < 20 {fmt.Println("ge > 16 且 age < 20, result age is:", age)} else if age > 22 {fmt.Println("age is >22")} else {fmt.Println("age is <16 or > 22")}// ||:或,满足其中一个条件即可if age > 20 || age == 18 {fmt.Println("age is >20 or ==18")}// 常用判断满足直接返回值,避免使用elsenum := 19if num%2 == 0 {fmt.Println(num, "is even")return}fmt.Println(num, "is odd")// switch条件语句,匹配后默认break(可写多个条件)number := 18switch number {case 12, 13:fmt.Println("The is 12, 13")case 18:fmt.Println("The is 18")default:fmt.Println("The is default")}// switch还可以使用类似 if elseswitch {case number >= 16 && number <= 25:fmt.Println("The is >=16 and <=25")default:fmt.Println("switch default")}checkType(1)
}func checkType(i interface{}) {switch v := i.(type) {case string:fmt.Println(v, "is string")case int:fmt.Println(v, "is int")default:fmt.Println(v, "is other")}
}

在这里插入图片描述
End

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

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

相关文章

Go语言函数

什么是函数 func main() {fmt.Println("hello,world")//调用函数fmt.Println(add(1, 2)) }// func 函数名&#xff08;参数&#xff0c;参数。。。&#xff09;&#xff0c;函数调用返回值类型&#xff08;&#xff09; func add(a, b int) int {c : a breturn c }函…

Ray tracing 光线追踪 之 embree ,从入门到精通 02 从源码编译与安装

1. 下载预编译的ispc&#xff0c;安装 网址&#xff1a; https://ispc.github.io resources -> github page 进入ispc 的github的release页&#xff1a;Releases ispc/ispc GitHub 找到一个预编译好了的ispc&#xff0c;其中在windows平台上是&#xff1a;https://github…

Redis缓存穿透、击穿、雪崩介绍

面试高频&#xff0c;工作常用 缓存穿透&#xff08;查不到&#xff09; 概念 用户想要查询一个数据&#xff0c;发现redis内存数据库没有&#xff0c;也就是缓存没有命中&#xff0c;于是向持久层数据库查询。发现也没有&#xff0c;于是本次查询失败&#xff0c;当用户很多的…

GO实现跳跃表

GO实现跳跃表 文章目录GO实现跳跃表跳跃表介绍跳跃表的实现跳跃表的结构创建跳跃表跳跃表的插入和删除跳跃表的排名操作跳跃表的区间操作完整实现跳跃表介绍 跳跃表&#xff08;skiplist&#xff09;是一种有序的数据结构&#xff0c;它通过建立多层"索引"&#xff…

世界城市日|数字城市里看不见的“保安”,真面目竟是…

2022年10月31日&#xff0c;是第8个世界城市日。在数字化浪潮席卷全球的当下&#xff0c;城市发展亦进入新的阶段。建造数字城市&#xff0c;全面推进城市数字化转型成为当前城市建设的热议话题。数字城市、万物互联&#xff0c;与网络空间的融合必不可少。然而系统的复杂度越高…

简单使用gige千兆网口工业相机,国产崛起(二,c#)

发现海康的sdk不错&#xff0c;可以用海康&#xff0c;basler&#xff0c;大华工业相机&#xff0c;估计其他的也可以&#xff0c;有机会试一试&#xff01;国产厉害&#xff0c;崛起了&#xff01;赞一个&#xff0c;热情爆棚&#xff01;且随窃喜&#xff01; 首先下载海康工…

网站SEO标题撰写技巧,做到这些可以提高点击率

搜索引擎认为&#xff0c;一个网站的点击率越高&#xff0c;那么这个网站就越受欢迎&#xff0c;因此就会提高网站的关键词排名。网站的点击率越高&#xff0c;就会获得更多流量。网站标题和点击率息息相关&#xff0c;一个好的网站标题&#xff0c;能够轻松获得流量。那么&…

[carla入门教程]-2 pythonAPI的使用

本专栏教程将记录我从安装carla到调用carla的pythonAPI进行车辆操控的全流程,带领大家从安装carla开始,到最终能够熟练使用carla仿真环境进行传感器数据采集和车辆控制. 第二节 pythonAPI的使用 本小节主要学习使用 pythonAPI来与carla服务器进行交互.包括获取信息,发送信息.…

IDEA热部署插件JRebel使用

JRebel安装与激活 JRebel 使用 此时已经安装好并已激活&#xff0c;我们使用 JRebel debug的时候&#xff0c;修改代码&#xff0c;不能实现热部署&#xff0c;因此还需要设置其他地方 1.项目自动编译 设置 compiler.automake.allow.when.app.running ctrlshiftA 或者 help->…

vue相关原理

vue 原理 面试为什么要考察原理 知其然知其所以然&#xff0c;各行各业通用的道理了解原理才能用的很好&#xff0c;专业性考察&#xff0c;技术的追求竞争激烈&#xff0c;则优录取大厂造轮子&#xff08;业务定制&#xff1a;有些框架不能满足需求&#xff09; 面试中如何…

【Spark NLP】第 19 章:生产化 NLP 应用程序

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

docker下快速部署openldap与PHPLdapAdmin

在一个组织中&#xff0c;为了简化各种内部系统的账号和密码的管理&#xff0c;往往就需要ldap来进行管理了。 对于ldap的实现方式也非常多&#xff0c;但在免费的开源系统中&#xff0c;openldap是ldap的首选系统。 同时&#xff0c;在这一切讲究快速的时代&#xff0c;采用d…

大数据ClickHouse进阶(二十二):ClickHouse优化

文章目录 ClickHouse优化 一、表优化 1、日期字段避免使用String存储 2、Nullable值处理 <

计算机毕业设计(附源码)python音蕾心动

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

云IDE的简单使用、体验与学习

云IDE的简单使用、体验与学习一、简单尝试二、官网展示的特点三、视频用例3.1、用Cloud IDE快速启动开源项目3.2、用Cloud IDE 在线提交PR云IDE产品介绍 云IDE使用教程 免费使用地址&#xff1a;点击【云IDE】&#xff0c;即可开始创建工作空间。 一、简单尝试 快速创建工作空…

学习用Python实现PPT的自动化

前言 在日常工作中&#xff0c;我们总是需要创建或修改PPT。但你也可以用Python来创建或修改PPT文件。本文将告诉你如何使用Python-pptx模块自动或用PPT模板生成ppt&#xff0c;以及如何通过实例修改现有的PPT。 &#xff08;文末送福利&#xff09; 1.Python模块python-ppt…

hbuilderx ios自定义基座真机测试

任务描述&#xff1a; 用uniapp框架写了一个app应用&#xff0c;需要在ios苹果手机上真机运行测试。 hbuilderx不再支持标准基座真机运行了&#xff0c;需要自定义基座运行 制定自定义基座需要准备的材料&#xff1a; ios的appid,profile文件&#xff0c;私钥证书&#xff0…

动视是否磨灭了暴雪的灵魂?

对于成千上万的人&#xff0c;也许是数百万人来说&#xff0c;暴雪是——或者曾经是——一家特殊的公司。 暴雪——游戏开发的典范 对于奇幻世界的关注&#xff0c;暴雪是无与伦比的。如果游戏没有准备好&#xff0c;它就不会发布。1998 年&#xff0c;尽管《魔兽争霸&#xf…

算法复杂度分析

复杂度分析 参考&#xff1a;《算法导论》、复杂度 - OI Wiki (oi-wiki.org)、一文弄懂算法的时间和空间复杂度分析 - 知乎 (zhihu.com)、算法讲解之复杂度分析 - 知乎 (zhihu.com)、算法的时间复杂度和空间复杂度-总结_zolalad的博客-CSDN博客_时间复杂度 算法复杂度分析的阶段…

梦开始的地方 —— C语言数据在内存中的存储(整形+浮点型)

文章目录整形在内存中的存储1. 数值类型的基本分类2. 整形在内存中的存储1. 原码、反码、补码2. 内存中为什么要存放补码&#xff1f;3. 大小端存储4. 无符号有符号数练习5. 有符号数无符号数小结浮点型在内存中的存储IEEE 754整形在内存中的存储 1. 数值类型的基本分类 整形…