运算符和流程控制 | 青训营笔记

94 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

1. 运算符

  1. 这部分没啥好说的,和其它语言有着相似的运算符
  2. 同种数据类型的数据相除结果也是整型
  3. Go语言中也有指针的概念,所以就有*指针的解引用和&取地址运算符
  4. Go语言中没有前置自增或自减运算符
  5. Go语言不支持三目运算符
  6. Go语言有如下两种获取变量的方式
    1. fmt.Scanln()方法,这个方法直接传递变量的地址即可,遇到换行符才会停止输入
    2. fmt.Scanf()方法,这份方法和C语言中的scanf()方法是一样的,需要通过格式符指定变量的类型

2. 流程控制

2.1 if-else

// 1. 单分支if语句
if a == 1 {
	fmt.Println("Hello World!")
}

// 2. 双分支语句
if a == 1 {
    ...
} else {
    ...
}

// 3. 多分支语句
if a == 1 {
    ...
} else if a == 2 {
    ...
} else {
    ...
}

/*
几点需要说明:
1. Go语言中的if语句是不需要加括号的 
2. 暂时就上面一点
*/

// Go语言还可以在if的判断条件前加一个执行语句,这样可以获取返回值然后同时判断返回值,同时
// 将返回值的范围限定在if语句范围内
if a := []int{1, 2, 3}[0]; a != 2 {
		fmt.Println("第一个数字不是2")
	} else {
		fmt.Println("第一个数字是2!")
	}

2.2 for循环

1. 关于循环的说明

  1. Go语言中只有for循环,没有while和do while循环
  2. Go语言写for循环的时候后面不需要打花括号
  3. for循环是可以和while以及do while循环等价的

2. for

// 1. 一个最简单的for循环
for i := 0; i < 10; i++ {
	fmt.Println(i + 1)  // 打印1 ~ 10之间的整数
}


// 2. for循环和while等价转换
for {
    // 1. 循环条件判断语句
    // 2. 循环体
    // 3. 更新循环变量
}
// 实际上下面这种更像while循环   
for i <= 10 {
    // 这里输出语句
    i++  // 更新循环控制变量
}


// 3. for循环和do while等价转换
for {
	// 1. 循环体
    // 2. 更新循环变量
    // 3. 循环条件判断语句
}


// 4. for还可以无限循环
for {}


// 5. for循环可以使用break语句跳出第二层
JumpLoop:
	for i := 0; i < 5; i++ {
		for j := 0; j < 5; j++ {
			if i == 4 && j == 3 {
				break JumpLoop
			}
		}
	}


// 6. for循环还可以这么写,实际上就是将if判断整合到了for循环当中
i := 0
for i <= 10 {
    // 这里可以输出一些语句
    i++
}

3. for-range

3.1 语法
  1. for position, val := range 数组/切片/字符串
  2. for key, value := range map
  3. for val := range channel
3.2 举例
// 1. 遍历数组和切片
for pos,val := range [...]int{1, 2, 3} {
    fmt.Println("pos", pos, "val", val)
}
for pos,val := range []int{1, 2, 3} {
    fmt.Println("pos", pos, "val", val)
}

// 2. 遍历字符串
for pos, val := range "hello, world" {
    fmt.Println("pos", pos, "val", val)  // 注意这个获取的val是rune类型, rune是int32的别名
}

// 3. 遍历map,注意使用简化赋值的时候必须显式赋值,同时键值对后面还要加上,
m := map[string]int{
    "go": 1,
    "web": 2,
}
for key, val := range m {
    fmt.Println(key, val)
}
for _,val := range m {
    fmt.Println(val)  // 只获取值
}
for key,_ := range m {
    fmt.Println(key)  // 只获取key
}
for key := range m {
    fmt.Println(key)  // 只获取key
}

2.3 switch-case语句

1. 说明

  • Go语言中的switch语句很灵活,后面没有要求是常量或者某种特殊类型,可以是常量、变量、有返回值的函数、有结果的表达式
  • case后面表达式的值要和switch的相匹配
  • Go语言中一个case就是一个语句块,不需要像C系语言那样使用break跳出
  • case后面可以有多条语句(多个表达式),表达式中间用逗号分隔
  • default语句不是必须的,但是建议带上
  • case语句后面跟的常量值是不能重复的
  • switch后面也可以不跟表达式,case语句使用类似if语句的判断条件即可
  • switch语句使用fallthrough可以穿透一层case
  • switch后面可以接i := variable.(type)判断接口的类型这个i只能在switch语句范围内使用

2. 举例

// 下面只介绍go语言新添加的switch用法
// 1. 一个分支多个值
str := "Java"
switch str {
    case "Java", "go":  // 只要有一个匹配成功就行
        fmt.Println("Java")
    default:
        fmt.Println("这是默认情况")
}


// 2. 分支表达式
a := 1
switch {  // 这后面不用写变量
    case a >= 1 && a <= 10:
        fmt.Println("找到a")
    default:
        fmt.Println("你好")
}

2.4 goto、break和continue

  1. 这个没有什么多说的,只是需要注意一下break和continue都可以跳转到指定的位置
  2. goto语句可以用于退出执行多层循环外的语句,在代码大量重复的情况下也可以起到简化的作用

2.5 关于Go语言中的运算符的补充

  1. 其实go语言中的运算符和Java/C系语言中的运算符差不多,并且流程运算符也是,实际上这几着之间都是相通的