GO语言基础条件、跳转、Array和Slice

1. 判断语句if

  1. 条件表达式没有括号(这点其他语言转过来的需要注意)

  2. 支持一个初始化表达式(可以是并行方式,即:a, b, c := 1, 2, 3)

  3. 左大括号必须和条件语句或 else 在同一行

  4. 支持单行模式

  5. 初始化语句中的变量为 block 级别,同时隐藏外部同名变量

有关 if 语句示例代码如下:

复制代码
package mainimport "fmt"func main() {a := trueif a, b, c := 1, 2, 3; a + b + c > 6 {fmt.Println("大于6")} else {fmt.Println("小于等于6")fmt.Println(a)}fmt.Println(a)if 7 % 2 == 0 {fmt.Println("7 is even")} else {fmt.Println("7 is odd")}
}
复制代码

运行打印结果如下所示:

1
2
3
小于等于6
1
true<br>7 is odd

if 判断语句比较简单,只要掌握了相关的语法结构以及上一节讲到的相关基础知识,应用 if 语句也就没有什么问题了。

2. 循环语句 for

  1. Go 只有 for 一个循环语句关键字,但是它支持3中形式

  2. 初始化和步进表达式可以是多个值

  3. 条件语句每次循环都会被重新检查,因此不建议在条件语句中使用函数,尽量提前计算好条件并以变量或常量代替

  4. 左大括号必须和条件语句在同一行

复制代码
package mainimport (std "fmt"
)func main() {/**以下演示for的3种表现形式*/i := 1for i <= 3 {    // 类似于java中的:while(i <= 3){}std.Println(i)i = i + 1}for {        // 类似于java中的:while(true){}std.Println("while loop")break}for n := 0; n <= 5; n++ {  // 类似于java中的:for (int n = 0; n <= 5; n++) {}if n % 2 == 0 {continue}std.Println(n)}
}
复制代码

以上代码打印结果如下所示:

1
2
3
4
5
6
7
1
2
3
while loop
1
3
5

3. 选择语句 switch

  1. 可以使用任何类型或表达式作为条件语句

  2. 不需要写break,一旦条件符合自动终止

  3. 如果希望继续执行下一个case,需使用 fallthrough 语句

  4. 支持一个初始化表达式(可以是并行方式),右侧需要跟分号,和 if 条件表达式一样

  5. 左大括号必须和条件语句在同一行

复制代码
 1 package main2 3 import (4     std "fmt"5     "time"6 )7 8 func main() {9     i := 2
10     std.Println("Write number ", i, " as ")
11     switch i {    // 基本switch使用
12     case 1:
13         std.Println("one")
14     case 2:
15         std.Println("two")
16     case 3:
17         std.Println("three")
18     default:
19         std.Println("ohter")
20     }
21 
22     switch time.Now().Weekday() {    // 条件表达式作为判断条件
23     case time.Saturday, time.Sunday:
24         std.Println("It's the weekend")
25     default:
26         std.Println("It's a weekday")
27     }
28 
29     t := time.Now()
30     switch {            // 没有判断语句则和 if/else 效果一样
31     case t.Hour() < 12:
32         std.Println("It's before noon")
33     default:
34         std.Println("It's after noon")
35     }
36 
37     a := 1
38     switch {
39     case a >= 0:
40         std.Println("a >= 0")
41         fallthrough        // 这里不加的话,只会打印 a >= 0,不会向下执行了
42     case a >= 1:
43         std.Println("a >= 1")
44     }
45 }
复制代码

以上代码运行结果如下:

1
2
3
4
5
6
Write number  2  as
two
It's a weekday
It's after noon
a >= 0
a >= 1

4. 跳转语句 goto、break、continue

  1. 三个语法都可以配合标签使用

  2. 标签名区分大小写,若不使用会造成编译错误

  3. break 与 continue 配合标签可用于多层循环的跳出

  4. goto 是调整执行位置,与其他 2 个语句配合标签的结果并不相同

复制代码
 1 package main2 3 import std "fmt"4 5 func main() {6     LABEL_BREAK:7     for {8         for i := 0; i < 10; i++ {9             if i > 2 {
10                 break LABEL_BREAK    // 结束循环到指定目标位置
11             } else {
12                 std.Println("break number is : ", i)
13             }
14         }
15     }
16     
17     LABEL_CONTINUE:
18     for i := 0; i < 10; i++ {
19         for {
20             std.Println(i)
21             continue LABEL_CONTINUE        // 结束当前循环层到指定目标位置重新开始
22         }
23     }
24 
25     // LABEL_GOTO  如果goto跳转目标放在这里,则形成了死循环
26     for {
27         for i := 0; i < 10; i++ {
28             if i > 2 {
29                 goto LABEL_GOTO        // 跳转到指定目标,从指定目标后开始继续执行
30             } else {
31                 std.Println("goto number is : ", i)
32             }
33         }
34     }
35     LABEL_GOTO:
36 } 
复制代码

以上代码打印结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
break number is :  0
break number is :  1
break number is :  2
0
1
2
3
4
5
6
7
8
9
goto number is :  0
goto number is :  1
goto number is :  2

 5. 数组 Array

  1.  定义数组的格式:var name [num]type  -->  var a [10]int  (定义1个长度为10类型为int的数组,数组名为 a)

  2. 数组长度也是类型的一部分,因此具有不同长度的数组为不同的类型,这点很重要

  3. 数组再 Go 中为值类型,故数组之间可以使用 ==、!= 进行比较,但不可以使用 <、> 进行判断

  4. 可以使用 new 来创建数组,此方法返回一个指向数组的指针

  5. Go 支持多维数组,但是就和其他语言一样,不推荐使用

针对数组的基本应用案例如下:

复制代码
package mainimport "fmt"func main() {var a [5]int        // 以为数组的基本应用fmt.Println("emp:", a)a[4] = 100fmt.Println("set:", a)fmt.Println("get:", a[4])fmt.Println("len:", len(a))b := [5]int{1, 2, 3, 4, 5}    // 数组初始化并赋值fmt.Println("arrayB:", b)var twoD [2][3]int    // 二维数组的应用for i := 0; i < 2; i++ {for j := 0; j < 3; j++ {twoD[i][j] = i + j}}fmt.Println("twoD:", twoD)
}
复制代码

以上代码打印结果如下所示:

1
2
3
4
5
6
emp: [0 0 0 0 0]
set: [0 0 0 0 100]
get: 100
len: 5
arrayB: [1 2 3 4 5]
twoD: [[0 1 2] [1 2 3]]

 那么,这里使用数组采用冒泡排序方式实现对一组数排序功能,代码如下:

复制代码
package mainimport ("fmt"
)func main() {// 未排序数组,此处使用的变长数组其长度决定于你传入数据的多少sort := [...]int{1, 7, 4, 2, 5}fmt.Println(sort)// 冒泡排序,由大到小num := len(sort)for i := 0; i < num; i++ {for j := i + 1; j < num; j++ {// 比较大小if sort[i] < sort[j] {temp := sort[i]sort[i] = sort[j]sort[j] = temp}}}fmt.Println(sort)
}
复制代码

以上代码运行结果如下所示:

1
[9 7 4 3 2]

6. 切片 Slice

  1. 其本身并不是数组,它指向底层的数组

  2. 作为变长数组的替代方案,可以关联底层数组的局部或全部

  3. slice 类型为引用类型

  4. 可以直接创建或从底层数组获取生存

  5. 使用 len() 获取元素个数,cap() 获取容量

  6. 一般使用 make() 创建

  7. 如果多个 slice 指向相同底层数组,其中一个的值改变会影响全部

  8. make([]T, len, cap)  其中 cap 可以省略,则和 len 的值相同,len 表示元素的个数,cap 表示当前最大可以存放的容量

复制代码
 1 package main2 3 import "fmt"4 5 func main() {6     // 创建长度为3,容量为3的切片,容量不设置默认为与len相同7     s := make([]string, 3)8     fmt.Println(s)9 
10     // 通过操作切片对数组进行赋值
11     s[0] = "a"
12     s[1] = "b"
13     s[2] = "c"
14     fmt.Println("set:", s)
15     fmt.Println("get:", s[2])
16 
17     fmt.Println("len:", len(s), ", cap:", cap(s))
18 
19     // 创建长度为3容量为10类型为int对切片,当放置元素超过10底层会自动翻倍到容量为20,再超再翻倍为49,如此类推
20     s1 := make([]int, 3, 10)
21     fmt.Println("len:", len(s1), ", cap:", cap(s1))
22 
23     s1 = append(s1, 9, 7, 5)
24     fmt.Println("append:", s1)
25     fmt.Println("len:", len(s1), ", cap:", cap(s1))
26 
27     // 实现切片等拷贝
28     c := make([]int, len(s1))
29     copy(c, s1)
30     fmt.Println("copy:", c)
31 
32     // 实现切片上等再切片,类似与python中等截取
33     l := s1[2:5]  // 范围为:[2, 5) 即前闭后开
34     fmt.Println("slice[2:5]:", l)
35 
36     l = s1[:5]    // 范围为:[0, 5)
37     fmt.Println("slice[:5]:", l)
38 
39     l = s1[2:]    // 范围为:[2, len(s1))
40     fmt.Println("slice[2:]:", l)
41 
42     // 也可以初始化切片时直接赋初始值
43     t := []string{"a", "b", "g", "h", "l"}
44     fmt.Println("init slice:", t)
45 
46     // 切片还可以存放不同长度等组合
47     twoD := make([][]int, 3)
48     for i := 0; i < 3; i++ {
49         innerLen := i + 1
50         twoD[i] = make([]int, innerLen)
51         // 为内部数据进行赋值
52         for j := 0; j < innerLen; j++ {
53             twoD[i][j] = i + j
54         }
55     }
56     fmt.Println("towD:", twoD)
57 }
复制代码

以上代码运行结果如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
[  ]
set: [a b c]
get: c
len: 3 , cap: 3
len: 3 , cap: 10
append: [0 0 0 9 7 5]
len: 6 , cap: 10
copy: [0 0 0 9 7 5]
slice[2:5]: [0 9 7]
slice[:5]: [0 0 0 9 7]
slice[2:]: [0 9 7 5]
init slice: [a b g h l]
towD: [[0] [1 2] [2 3 4]]

以上切片代码,其实可以用下面这张图片解释 Slice 与底层数组的对应关系:

  

  切片概念很重要,对后续很多程序都有很大的用处,这里真对切片中几个重要的概念再着重提一下:

  reslice(如上图中的 Slice_a 和 Slice_b)

    1. reslice 时索引以被 slice 的切片为准

    2. 索引不可以超过被 slice 的切片的容量 cap() 值

    3. 索引越界不会导致底层数组的重新分配而是引发错误

    说明:这里说的 reslice 代表当前切片是基于数组或 slice 截取生成的,即是它们其中的一部分

  append

    1. 可以在 slice 尾部增加元素

    2. 可以将一个 slice 追加在另外一个 slice 尾部

    3. 如果最终长度未超过追加到 slice 的容量则返回原是 slice

    4. 如果超过追加到的 slice 的容量则将重新分配数组并拷贝原始数据

  copy

    1. coyp(dest, source) 两个参数代表将第二个参数代表的切片拷贝给第一个参数代表的切片

 小总结:Array 与 Slice 之间的区别

 数组Array所有使用案例如下:

var m [3]int               // 定义了一个长度为3的int数组,元素值都为0
m:= [3]int{}              // 声明了一个长度为3的int数组,元素值都为0
a := [3]int{1, 2, 3}     // 声明了一个长度为3的int数组
b := [10]int{1, 2, 3}    // 声明了一个长度为10的int数组,其中前三个元素初始化为1、2、3,其它默认为0
c := [...]int{4, 5, 6}    // 可以省略长度而采用 "..." 的方式,Go会自动根据元素个数来计算长度   

  切片Slice所有使用案例如下:

var m []int        // 声明了一个指向底层数组的切片
m:= []int{}        // 声明了一个指向底层数组的切片
a := array[2:5]    // a指向数组的第3个元素开始,并到第五个元素结束的切片
b := array[:5]    // b指向数组的第0个元素开始,并到第五个元素结束的切片
c := array[2:]     // c指向数组的第2个元素开始,并到最后一个元素结束的切片
d := b[3:]       // d指向切片的第3个元素开始,并到最后一个元素结束的切片(即可以切片嵌套)

  由上面的结果可以看出,声明数组时,方括号内写明了数组的长度或使用...自动计算长度,而声明 slice时,方括号内没有任何字符。

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

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

相关文章

干式真空泵原理_如何安装干式墙锚在墙壁上悬挂重物

干式真空泵原理If you ever plan to mount something to the wall that’s even remotely heavy, you’ll need to use drywall anchors if a stud isn’t available. Here are the different types of drywall anchors, and how to use each one. 如果您打算将甚至更重的东西安…

sharding-jdbc学习

sharding-jdbc的全局id生成策略是通过雪花算法来实现的。 sharding-jdbc也是一个数据的中间件&#xff0c;可实现读写分离和分库分表&#xff0c;比mycat要简单些。 nginx与ribbon实现负载均衡的区别&#xff1a;nginx是实现服务器端的负载均衡&#xff0c;ribbon是实现客户端即…

像go 一样 打造.NET 单文件应用程序的编译器项目bflat 发布 7.0版本

现代.NET和C#在低级/系统程序以及与C/C/Rust等互操作方面的能力完全令各位刮目相看了&#xff0c;有人用C#开发的64位操作系统: GitHub - nifanfa/MOOS: C# x64 operating system pro...&#xff0c;截图要介绍的是一个结合Roslyn和NativeAOT的实验性编译器bflat &#xff1a;h…

添加dubbo.xsd的方法

整合dubbo-spring的时候&#xff0c;配置文件会报错 因为 阿里关闭在线的域名了.需要本地下载xsd文件 所以&#xff0c;需要下载本地引入。 解决方式&#xff1a; 在dubbo的开源项目上找到xsd文件&#xff1a; https://github.com/alibaba/dubbo Idea使用本地xsd Setting…

Spring Cloud Feign注意点

2019独角兽企业重金招聘Python工程师标准>>> 1、只要在启动类中加入EnableFeignClients注解&#xff0c;才会扫描FeignClient注解 2、Feign主要是通过接口调用&#xff0c;底层其实也是HttpClient/OkHttp 1&#xff09;提供一个Feign接口&#xff0c;加入对应的rest…

word 替换 增加引号_如何在Word 2013文档中替换部分(不是全部)智能引号

word 替换 增加引号Word includes a setting that allows you to automatically convert straight quotes to smart quotes, or specially curved quotes, as you type. However, there may be times you need straight quotes and you may have to convert some of the quotes…

i-i.me:网址导航真的是伪需求吗?

每一个程序员都有一个框架梦&#xff0c;每一个站长曾经都有一个网址导航梦。本人从07年开始接触互联网&#xff0c;成为一名中国草根站长&#xff0c;到现在终于熬成半个程序员。10年时间&#xff0c;没有赚到钱&#xff0c;也没有练就一身过硬的技术&#xff08;所以叫半个程…

.Net AOT--Win11搭建和编译 X64 汇编

楔子&#xff1a;windows11上编译x64汇编&#xff0c;很多人不太了解。甚至搞出DOSBox这种几亿年前的老古董&#xff0c;还有的专门搞些Linux下面的工具来搞到Windows上运行。其实这些大可不必&#xff0c;也没这么麻烦。微软技术出身&#xff0c;基本上工具链齐全。本篇来看下…

安装mongoDB遇见的一个路径问题

如果安装路径不存在&#xff0c;则不会解压EXE软件&#xff01; 安装monogoDB后&#xff0c;它不会自动添加执行路径&#xff01; 意思就是安装路径是D盘下面的mongoDB文件夹&#xff0c;假如不存在这个文件夹&#xff0c;则不会安装成功 你需要添加路径&#xff1a; 你可以利用…

【Filecoin源码仓库全解析】第一章:搭建Filecoin测试节点

2019.2.14 情人节&#xff0c;Filecoin项目开放了核心源码仓库go-filecoin&#xff0c;并更新了 filecoin-project organization下的诸多核心成果&#xff0c;这意味着&#xff0c;Filecoin已然度过了最困难的难点攻关期&#xff0c;进入到了全民公测阶段。 本系列文章将协助大…

DNS 代理?Pipy:这我也可以

Pipy 是个可编程代理&#xff0c;曾经我们做过 TCP/HTTP 代理、MQTT 代理、Dubbo 代理、Redis 代理、Thrift 代理。前几天有人问 DNS[1] 的代理能不能做&#xff1f;当然可以&#xff0c;而且 DNS 代理已经应用在 跨集群流量调度 中&#xff0c;文末经对此进行简单地介绍。阅读…

如何在Windows中快速轻松地将文件发送到SkyDrive

We have already shown you how you can share external folders with your SkyDrive, but what if you actually want to copy a file or folder into your SkyDrive folder? Of course copying and pasting is nowhere near geeky enough, so here’s how to add a SkyDrive…

windows删除桌面ie_从Windows 8“开始”屏幕启动IE的桌面版本

windows删除桌面ieThere are two versions of Internet Explorer in Windows 8, one you can only launch from the Start Screen and the Desktop version which you can only launch from the Desktop. Lets look at how we can launch the Desktop version from the Start S…

.NET Conf China 2022 圆满落幕,明年再见!

时光飞快&#xff0c;还记得本月的第一个周末吗&#xff1f;12月3日-12月4日&#xff0c;相信对于 .NET 开发者来说一定记忆犹新&#xff01;.NET Conf China 2022 于12月4日圆满落幕。八方助力共谱大会盛宴.NET Conf China 2022 是一个社区性质的技术峰会&#xff0c;本次大会…

马哥linux高薪中级-DNS

第一章 简介一、DNSdomain name server&#xff0c;用来将计算机名称或者域名解析成ip地址的服务协议。用户在使用域名访问时会先通过DNS服务请求域名对应的ip地址&#xff0c;然后缓存下来&#xff0c;然后才通过ip地址进行通信。最初域名解析是通过HOSTS文件来静态绑定的。DN…

愚蠢的怪胎技巧:通过命令行管理SkyDrive

Originally launched as an April Fools prank by the Microsoft SkyDrive team, SkyCMD turned out to be a really geeky way to manage files and folders on your SkyDrive from the command line. Lets take a quick look. SkyCMD最初是由Microsoft SkyDrive团队以愚人节恶…

关于vue父子组件之间事件触发及数据传递问题

父组件&#xff1a;1&#xff0c;引入子组件2&#xff0c;ref 3&#xff0c;需要更新数据操作的地方 子组件&#xff1a;1&#xff0c;定义同名事件&#xff0c;拿到数据执行相关操作

.NET Core如何通过认证机制访问Kafka?

【.NET Core】| 总结/Edison Zhou大家好&#xff0c;我是Edison。最近有一个ASP.NET Core使用认证机制访问Kafka的需求&#xff0c;加之我们又使用了CAP这个开源项目使用的Kafka&#xff0c;于是网上寻找了一番发现对应资料太少&#xff0c;于是调查了一番&#xff0c;做了如下…

JQuery框架2.位置属性|筛选方法|事件

1、位置属性 jquery的css position获取匹配元素相对父元素的偏移位置&#xff1b;offset获取匹配元素在当前视口的相对偏移,返回的对象包含两个整型属性&#xff1a;top 和 left $("p").offset() $(div).offset().top $("p").offset().left scrollTop获取匹…

jenkins没安装git报错

Jenkins新建项目中源码管理使用Git时遇到如下问题&#xff1a; 在安装jenkins服务器上查看一下git版本&#xff0c;可能没有安装git 也可能是git版本太低 [rootlocalhost nnnnn]# git --version git version 1.8.3.1 yum安装的版本太低了 打开Jenkins的 主页面 > 系统管理 …