目录
控制台获取--Scanln()
Go语言中的控制台输入语句和C语言的很像
我们可以直接一行定义很多个输入,也可以分别定义,然后集体输出,控制台输入这里没什么特殊的细节问题,相对简单,只有一点需要特别注意:一条语句的Scanln,我们再控制台输入时也必须时一行输入完,不能像C/C++里一样可以用换行输入下一个变量,Go中只能用空格分割。
注:我们在控制台输入时必须确保数据类型的正确,如果数据类型错误那么就会出现乱码,或者数据为类型的默认值,Go系统会自动进行类型判断,但是它并不会报错,所以在某些我们不打印数据出来的情况下可能会导致数据出错但我们并不知道,所以适当的加上条件判断是必要的
if-else语句
在Go语言中,if逻辑语句不需要括号,但是必须要有大括号,在C++中如果 if 的执行体只有一条语句可以不要大括号,但是Go中必须存在,并且 else 必须在 if 的大括号后面,不能分行写。
特殊的编写方法是我们可以在if后直接初始化我们的变量。
我在写这里的时候虽然觉得很厉害,但是忽然觉得这么写代码的意义在哪呢?我们根本没必要定义这么一个变量然后判断这个变量是否符合哪些条件,多少有点脱裤子放屁的感觉。
结合一下之前的控制台输入和逻辑模块,其实就是我们需要在不同作用域中有不同的操作时这么用比较灵活
注:
①我们在 if 代码块中直接初始化的作用就是可以隔离作用域,避免了重复命名的问题,所以在这种场景下我们可以使用这种代码编写方式,而不是简单的直接定义一个变量然后判断这个变量
②其次前面多次说到 if 后的代码块可以直接初始化,所以else后的代码块是不能初始化数据的,这一点要注意
Switch
switch语句和C++中的区别不大,就是一些细节性的处理上有些不同
虽然用起来的区别不大,但是还是有一些细节问题需要注意的
(1)switch后是一个表达式(即:常量值、变量、一个有返回值的函数等都可以)
(2)case后面的表达式如果是常量值(字面量),则要求不能重复
即不能出现
case 1:......
case 1:....
(3)case后的各个值的数据类型,必须和 switch 的表达式数据类型一致
(4)case后面可以带多个值,使用逗号间隔。比如 case 值1,值2...
(5)case后面不需要带break
(6)default语句不是必须的,位置也是随意的。
(7)switch后也可以不带表达式,当做if分支来使用
(8)switch后也可以直接声明/定义一个变量,分号结束,不推荐(类似 if 的用法)
(9) switch穿透,利用fallthrough关键字,如果在case语句块后增加fallthrough ,则会继续执行下一个case,也叫switch穿透(个人感觉使用情景比较受限,没什么用)
func main() {
num := 2
switch num {
case 1:
fmt.Println("数字为1")
fallthrough
case 2:
fmt.Println("数字为2")
fallthrough
case 3:
fmt.Println("数字为3")
default:
fmt.Println("未匹配到数字")
}
}
循环
go语言中只有一种循环,就是for循环,其实没太大改变,就是我们不需要写for后面的括号了
func main(){
for i:=0;i<5;i++{
fmt.Println(i," ")
}
for{//死循环
fmt.Println("for_test")
}
for ;; {//死循环
fmt.Println("same")
}
}
标签配合使用,标签是Go语言中特有的关键字形式
func main(){
testLabel://标签,可以配合break,continue,goto语句
for i:=0;i<5;i++{
for j:= i;j<5;j++{
if j==3{
break testLabel//直接退出到外循环(已被标签标记)
}else{
fmt.Println(i,j)
}
}
}
}
特殊用法:range语句,在Go语言中我们可以直接打印出我们字符串真实的值,包括汉字!
package main
import "fmt"
func main(){
str := "hello世界"
//Go语言中,汉字是utf-8字符集,一个汉字3个字节
for i,val:=range str{
fmt.Printf("index:%d val:%c\n",i,val)
}
}
在这我们可以看到index索引的值在字符时是+1自增的,但是在“世界”这里从5变为了8,也就是3字节。