GO_基础2
一、控制语句
- 
条件语句
if语句、if ... else 语句, if嵌套语句、if...else...if语句、
- 
循环语句- 
简单for循环
- 
for作为无限循环
- 
for作为while循环
- 
for循环中的简单范围
 
- 
- 
- 
- i和j是分配迭代值的变量。它们也称为迭代变量。
 
 
- 
- 
- 
- 
第二个变量,即j是可选的。 
- 
范围表达式在循环开始之前被评估一次。 
- 
package main import "fmt" func main() { //这里rvariable是一个数组 rvariable:= []string{"GFG", "Geeks", "cainiaojc"} //i和j存储rvariable的值 //i存储单个字符串和的索引号 //j存储给定数组的单个字符串 for i, j:= range rvariable { fmt.Println(i, j) } }
 输出: 0 GFG 1 Geeks 2 cainiaojc
 
- 
- 
字符串中的for
 
- 
for循环可以遍历字符串的Unicode代码点。
在这里,索引是存储UTF-8编码代码点的第一个字节的变量,而chr是存储给定字符串的字符的变量,而str是字符串。
- 
- 
- 
示例 package main import "fmt" func main() { // 字符串作为for循环中的范围 for i, j := range "XabCd" { fmt.Printf("%U 的索引值为 %d\n", j, i) } }输出: U+0058 的索引值为 0 U+0061 的索引值为 1 U+0062 的索引值为 2 U+0043 的索引值为 3 U+0064 的索引值为 4
 
- 
- 
对于map使用for循环
 
- 
for循环可以遍历map的键和值对。
- 
- 
- 
示例 package main import "fmt" func main() { mmap := map[int]string{ 22: "Geeks", 33: "GFG", 44: "cainiaojc", } for key, value := range mmap { fmt.Println(key, value) } } 输出: 22 Geeks 33 GFG 44 cainiaojc
 
- 
- 
For通道:
 
- 
for循环可以遍历通道上发送的顺序值,直到关闭为止。
- 
- 
- 
复制代码 示例 package main import "fmt" func main() { // 使用 channel chnl := make(chan int) go func() { chnl <- 100 chnl <- 1000 chnl <- 10000 chnl <- 100000 close(chnl) }() for i := range chnl { fmt.Println(i) } } 输出: 100 1000 10000 100000 
 
- 
- 
重要事项: - 
在for循环的三个语句中不使用括号。 
- 
花括号在for循环中是必需的。 
- 
左括号应与post语句所在的行相同。 
- 
如果数组,字符串,切片或map集合为空,则for循环不会抛出错误并继续其流程。换句话说,如果数组,字符串,切片或map为nil,则for循环的迭代次数为零。 
 
- 
 
- 
- 
循环控制语句- 
Go语言支持3种循环控制语句: - 
Break 
- Continue
- 
Goto 
 
- 
- 
该语句用于将控制转移到程序中的标记语句。标签是有效的标识符,放在控件转移处的语句前面。由于难以跟踪程序的控制流,程序员通常不使用goto语句。 - 
package main import "fmt" func main() { var x int = 0 //for循环的工作原理与while循环相同 Lable1: for x < 8 { if x == 5 { //使用goto语句 x = x + 1; goto Lable1 } fmt.Printf("值为: %d\n", x); x++; } } 输出: 值为: 0 值为: 1 值为: 2 值为: 3 值为: 4 值为: 6 值为
 
- 
 
- 
- 
switch语句- 
Go语言支持两种类型的switch语句: - 
表达式switch - 
switch optstatement; optexpression{ case expression1: Statement.. case expression2: Statement.. ... default: Statement.. }
- 
package main import "fmt" func main() { // Switch 语句同时使用两种语句, 如可选语句, day:=4 和表达式 如:day switch day := 4; day { case 1: fmt.Println("Monday") case 2: fmt.Println("Tuesday") case 3: fmt.Println("Wednesday") case 4: fmt.Println("Thursday") case 5: fmt.Println("Friday") case 6: fmt.Println("Saturday") case 7: fmt.Println("Sunday") default: fmt.Println("Invalid") } }输出: Thursday 
 
- 
 
- 
- switch语句不带可选语句和表达式的示例:
- 
package main import "fmt" func main() { var value int = 2 // switch语句不带可选语句和表达式 switch { case value == 1: fmt.Println("Hello") case value == 2: fmt.Println("Bonjour") case value == 3: fmt.Println("Namstay") default: fmt.Println("Invalid") } } 输出: Bonjour
 
- 
- 没有默认语句的switch语句,case语句中的多个值:
- 
package main import "fmt" func main() { var value string = "five" //没有默认语句的switch语句,case语句中的多个值 switch value { case "one": fmt.Println("C#") case "two", "three": fmt.Println("Go") case "four", "five", "six": fmt.Println("Java") } } 输出: Java
 
- 
- 
类型switch- 
语法: switch optstatement; typeswitchexpression{ case typelist 1: Statement.. case typelist 2: Statement.. ... default: Statement.. }package main import "fmt" func main() { var value interface{} switch q := value.(type) { case bool: fmt.Println("值是布尔型") case float64: fmt.Println("值是float64类型") case int: fmt.Println("值是int类型") default: fmt.Printf("值的类型是: %T", q) } } 输出: 值的类型是: <nil>
 
- 
 - 
select 和 deadlock死锁- 
在Go语言中,select语句就像switch语句,但是在select语句中,case语句引用通信,即通道上的发送或接收操作。 在本文中,我们将学习如何使用默认情况来避免死锁。但是首先,我们了解什么是deadlock? - 死锁:当您试图从通道读取或写入数据但通道没有值时。因此,它阻塞goroutine的当前执行,并将控制传递给其他goroutine,但是如果没有其他goroutine可用或其他goroutine睡眠,由于这种情况,程序将崩溃。这种现象称为死锁。如下面的实例所示:
 - 
示例 package main func main() { //创建通道 //出现死锁是因为没有goroutine在写 //因此,select语句被永远阻塞 c := make(chan int) select { case <-c: } } 输出: fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan receive]: main.main()
 - 为了避免这种情况,我们在select语句中使用默认case。换句话说,当程序中出现死锁时,将执行select语句的默认情况以避免死锁。如下例所示,我们在select语句中使用默认情况以避免死锁。
 - 
- 
示例 package main import "fmt" func main() { //创建通道 c := make(chan int) select { case <-c: default: fmt.Println("!.. Default case..!") } } 输出: !.. Default case..!
 
- 
 - 当select语句只有nil通道时,也允许使用默认情况。如下面的实例所示,通道c是nil,所以默认情况下执行,如果这里的默认情况是不可用的,那么程序将永远被阻塞,死锁出现。
- 
示例 package main import "fmt" func main() { //创建通道 var c chan int select { case x1 := <-c: fmt.Println("Value: ", x1) default: fmt.Println("Default case..!") } } 输出: Default case..!
 
- 
 
 
- 
- 
 
- 
 
                     
                    
                 
                    
                

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号