Go 流程控制
时间:2020-03-19 09:03:15
收藏:0
阅读:51
Go在流程控制方面特点如下:
- 没有do和while循环,只有一个广义的for语句
- switch语句灵活多变,还可以用于类型判断
- if语句和switch语句都可以包含一条初始化子语句
- break语句和continue语句可以跟一条label标签语句,用于标识需要终止或继续的代码块
- defer语句可以使我们更加方便地执行异常捕获和资源回收任务
- select语句也可以用于多分支选择,但只与通道配合使用
- go语句用于异步启动goroutine并执行指定函数
for range 注意点:
- 对数组、切片或者字符串值进行迭代,:=左边只有一个迭代变量时,要注意只能得到元素的索引,而不是元素。
- 迭代没有任何元素的数组值、为nil的切片值、为nil的字典值、为“”的字符串值,不会执行for语句中的代码。for在一开始就会结束。因为这些值长度是0
- 迭代为nil的通道值会让当前流程永远阻塞在for语句上。
Golang之(if)流程控制
package main import ( "fmt" ) func testIf1() { num := 10 //var num int //num = 10 if num%2 == 0 { fmt.Printf("num:%d is even\n", num) } else { fmt.Printf("num:%d is odd\n", num) } fmt.Printf("num=%d\n", num) } func testIf2() { num := 10 if num > 5 && num < 10 { fmt.Printf("num:%d is > 5 and < 10\n", num) } else if num >= 10 && num < 20 { fmt.Printf("num:%d is > 10 and < 20\n,", num) } else if num >= 20 && num < 30 { fmt.Printf("num:%d is > 20 and < 30\n", num) } else { fmt.Printf("num:%d is > 30\n", num) } } func testIf3() { //num := 10 //var num int //num = 10 if num := 11; num%2 == 0 { fmt.Printf("num:%d is even\n", num) } else { fmt.Printf("num:%d is odd\n", num) } //fmt.Printf("num=%d\n", num) } func getNum() int { return 1 } func testIf4() { //num := 10 //var num int //num = 10 if num := getNum(); num%2 == 0 { fmt.Printf("num:%d is even\n", num) } else { fmt.Printf("num:%d is odd\n", num) } //fmt.Printf("num=%d\n", num) } func main() { //testIf1() //testIf2() //testIf3() testIf4() }
Golang之(for)用法
package main import ( "fmt" "math/rand" "time" ) func testFor1() { var i int for i = 1; i < 10; i++ { fmt.Printf("i=%d\n", i) } fmt.Printf("final:i=%d\n", i) } func testFor2() { var i int for i = 1; i < 10; i++ { fmt.Printf("i=%d\n", i) if i > 5 { break } } fmt.Println(i) } //打印奇数 func testFor3() { var i int for i = 1; i < 1000; i++ { //正整数,就调出本次循环,所以不打印 if i%2 == 0 { continue } fmt.Printf("i=%d\n", i) } } func testFor4() { i := 1 for i <= 10 { fmt.Printf("i=%d\n", i) i = i + 2 } } func testFor5() { i := 1 for i <= 10 { fmt.Printf("i=%d\n", i) i = i + 2 } } func testMultiSign() { a, b, c := 10, "hello", 100 fmt.Printf("a=%d b=%s c=%d\n", a, b, c) } func testFor6() { for no, i := 10, 1; i <= 10 && no <= 19; i, no = i+1, no+1 { fmt.Printf("%d*%d=%d\n", no, i, no*i) } } func testFor7() { for { fmt.Printf("hello\n") time.Sleep(time.Second) } } //峰云大神-http://xiaorui.cc/2016/03/23/golang%E9%9A%8F%E6%9C%BAtime-sleep%E7%9A%84duration%E9%97%AE%E9%A2%98/ func fengyun() { rand.Seed(time.Now().UnixNano()) for i := 0; i < 10; i++ { x := rand.Intn(10) fmt.Println(x) time.Sleep(time.Duration(x) * time.Second) } } //入口执行函数 func main() { //testFor1() //testFor2() //testFor3() //testFor4() //testFor5() //testFor6() //testFor7() fengyun() }
Golang实现一个密码生成器
package main import ( "flag" "fmt" "math/rand" "time" ) var ( length int charset string ) const ( NUmStr = "0123456789" CharStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" SpecStr = "+=-@#~,.[]()!%^*$" ) //解析参数 func parseArgs() { //需要接受指针,就传递地址,& flag.IntVar(&length, "l", 16, "-l 生成密码的长度") flag.StringVar(&charset, "t", "num", //反引号以原样输出 `-t 制定密码生成的字符集, num:只使用数字[0-9], char:只使用英文字母[a-zA-Z], mix:使用数字和字母, advance:使用数字、字母以及特殊字符`) flag.Parse() } //检测字符串中的空格 func test1() { for i := 0; i < len(CharStr); i++ { if CharStr[i] != ‘ ‘ { fmt.Printf("%c", CharStr[i]) } } } func generatePasswd() string { //初始化密码切片 var passwd []byte = make([]byte, length, length) //源字符串 var sourceStr string //判断字符类型,如果是数字 if charset == "num" { sourceStr = NUmStr //如果选的是字符 } else if charset == "char" { sourceStr = charset //如果选的是混合模式 } else if charset == "mix" { sourceStr = fmt.Sprintf("%s%s", NUmStr, CharStr) //如果选的是高级模式 } else if charset == "advance" { sourceStr = fmt.Sprintf("%s%s%s", NUmStr, CharStr, SpecStr) } else { sourceStr = NUmStr } fmt.Println("source:", sourceStr) //遍历,生成一个随机index索引, for i := 0; i < length; i++ { index := rand.Intn(len(sourceStr)) passwd[i] = sourceStr[index] } return string(passwd) } func main() { //随机种子 rand.Seed(time.Now().UnixNano()) parseArgs() fmt.Printf("length:%d charset:%s\n", length, charset) //test1() passwd := generatePasswd() fmt.Println(passwd) fmt.Printf("length:%d charset:%s\n", length, charset) }
defer 控制语句
package main import ( "fmt" ) //outerFunc是外围函数 //defer执行顺序是,先进后出,延迟调用指定的函数 //当外围函数中语句执行完毕时,只有延迟函数都执行完毕,外围函数才真的结束 //当执行外媒函数中的return时,只有延迟函数都执行完毕,外围函数才返回 //当外围函数中的代码引发运行错误时,只有延迟函数执行完毕,运行时的错误才会被扩散至调用函数。 //因此defer常用在执行释放资源或异常处理等收尾任务 //defer语句在外围函数体中位置不限,数量不限 func printNumbers() { for i := 0; i < 5; i++ { //defer被压进一个栈,函数完毕前一刻,先进后出,所以是43210 defer func() { fmt.Printf("%d", i) }() } } func printNumbers1() { for i := 0; i < 5; i++ { //defer被压进一个栈,函数完毕前一刻,先进后出,所以是43210 defer func(n int) { fmt.Printf("%d", n) }(i) } } func printNumbers2() { for i := 0; i < 5; i++ { //defer被压进一个栈,函数完毕前一刻,先进后出,所以是43210 defer func(n int) { fmt.Printf("%d", n) }(i * 2) } } func main() { printNumbers() fmt.Println() printNumbers1() fmt.Println() printNumbers2() }
Golang之一个简单的聊天机器人
package main import ( "bufio" "fmt" "os" "strings" ) func main() { //从标准输入读取数据 inputReader := bufio.NewReader(os.Stdin) fmt.Println("Please input your name:") //读取数据直到遇见\n位置 input, err := inputReader.ReadString(‘\n‘) if err != nil { fmt.Printf("An error occurred:%s\n", err) //异常错误后退出 os.Exit(1) } else { //用切片操作删除最后的\n name := input[:len(input)-1] fmt.Printf("Hello,%s!What can i di for you?\n", name) } for { input, err = inputReader.ReadString(‘\n‘) if err != nil { fmt.Printf("An error occurred:%s\n", err) continue } input = input[:len(input)-1] //全部转换为小写 input = strings.ToLower(input) switch input { case "": continue case "nothing", "bye": fmt.Println("Bye!") //正常退出 os.Exit(0) default: fmt.Println("Sorry,I didn‘t catch you.") } } }
原文:https://www.cnblogs.com/bubu99/p/12521709.html
评论(0)