Go基础语法-2 | 青训营笔记

82 阅读3分钟

Go基础语法-2 | 青训营笔记

Go 语言的设计目的是作为 C/C++ 的替代工具,是谷歌内部为了解决 C/C++ 开发中的一些痛点:编译慢、不受控制的依赖、三方库混乱、编程范式繁多(每个人都选择其中一部分特性)、并发编程麻烦、跨平台代码兼容、内存安全、工程开发效率低等等。

目录

  • <条件语句>
  • <循环语句>
  • <range遍历>

条件语句

1. if语句

  1. 无需添加()
  2. 可以在if开始前初始化语句中的局部变量
  if a>12 {
      fmt.Println("a>12")
  }
  
  if a := 3; a>12 {
      fmt.Println("a>12")
  }else if a<=2 {
      fmt.Println("a<=2")
  }else{
      fmt.Println("2<a<=12")
  }

2. switch

  1. 无需添加 break,go语言默认没有switch穿透
  2. 变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。
  switch var1 {
      case val1:
          ...
      case val2:
          ...
      default:
          ...
  }
  1. switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。
  switch x.(type){
      case type:
         statement(s);      
      case type:
         statement(s); 
      default: 
         statement(s);
  }
  1. 使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true。
  package main
  
  import "fmt"
  
  func main() {
  
      switch {
      case false:
              fmt.Println("case1 条件语句为 false")
              fallthrough
      case true:
              fmt.Println("case2 条件语句为 true")
              fallthrough
      case false:
              fmt.Println("case3 条件语句为 false")
              fallthrough
      case true:
              fmt.Println("case4 条件语句为 true")
      case false:
              fmt.Println("case5 条件语句为 false")
              fallthrough
      default:
              fmt.Println("默认")
      }
  }

3. select(对通道功能的增强)

  1. select 是 Go 中的一个控制结构,类似于 switch 语句
  2. select 语句只能用于通道操作,每个 case 必须是一个通道操作,要么是发送要么是接收。
  3. select 语句会监听所有指定的通道上的操作,一旦其中一个通道准备好就会执行相应的代码块。
  4. 如果多个通道都准备好,那么 select 语句会随机选择一个通道执行。如果所有通道都没有准备好,那么执行 default 块中的代码。
  • 每个 case 都必须是一个通道

  • 所有 channel 表达式都会被求值

  • 所有被发送的表达式都会被求值

  • 如果任意某个通道可以进行,它就执行,其他被忽略。

  • 如果有多个 case 都可以运行,select 会随机公平地选出一个执行,其他不会执行。

    否则:

    1. 如果有 default 子句,则执行该语句。
    2. 如果没有 default 子句,select 将阻塞,直到某个通道可以运行(select 会循环检测条件,如果有满足则执行并退出,否则一直循环检测。)Go 不会重新对 channel 或值进行求值。

循环语句

1. for

go没有while语句和do-while语句,只有for语句,不过for循环取代了whlie循环的功能

  for a:=1;a<10 {
      a++
  }
  for {
      //无限循环相当于whlie(true){}
      if a<10{
          break
      }
  }

2. 跳转语句

  • break

    暂停并跳出循环(下面是我直接从自己的java教学中抄出来的代码,只删除了三个括号和几个分号)

 a:for {
     b:for {
         //执行语句...
         if 条件表达式 {
             break a
          }
         //执行语句...
     }
 }
  • continue

    暂停并进行下一次循环(下面是我直接从自己的java教学中抄出来的代码,只删除了三个括号和一个分号)

 a:for ;;更新表达式1 {
     b:for ;;更新表达式2 {
         //执行语句...
         if 条件表达式 {
             continue a
         }
         //还是我,执行语句...
     }
 }
  • goto

    无条件跳转语句,老规矩,虽然没有去掉这个语句,但是在一般情况下,谁用,打死他。


range遍历

for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。格式如下:

  for key, value := range oldMap {
      newMap[key] = value
  }

以上代码中的 key 和 value 是可以省略。

如果只想读取 key,格式如下:

 for key := range oldMap
 或
 for key, _ := range oldMap

如果只想读取 value,格式如下:

  for _, value := range oldMap