GO语言学习三(流程控制语句)
2017-10-24 10:33
453 查看
一、For循环
Go 只有一种循环结构——
for循环包含三个由分号分开的组成部分:
初始化语句 : 第一次循环执行前被执行 可选
循环条件表达式 : 每次迭代开始前被求值:false or true 必须
后置语句:每次迭代后执行 可选
样例一 常用循环:
package main
import "fmt"
func main() {
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum)
}
样例二 只保留循环条件表达式:
package main
import "fmt"
func main() {
sum := 1
for ; sum < 1000; {
sum += sum
}
fmt.Println(sum)
}
样例三 死循环:
package main
func main() {
for {
}
}
DEMO :
package main
import "fmt"
func main() {
var i, j int
//计算100以内的素数
for i = 2; i < 100; i++ {
for j = 2; j <= i/j; j++ {
if i%j == 0 {
break // 如果发现因子,则不是素数
}
}
if j > (i / j) {
fmt.Printf("%d 是素数\n", i)
}
}
//字符串反转
str := "hello world"
arr := []rune(str)
for i,j := 0,len(arr)-1;i<len(arr)/2;i,j = i+1,j-1{
arr[i],arr[j] = arr[j],arr[i]
}
fmt.Println(string(arr))
}
二、if
条件表达式
可以在条件之前执行一个简单语句,这个语句定义的变量的作用域仅在if范围之内
样例:
package main
import (
"fmt"
"math"
)
func main() {
/* 定义局部变量 */
var a int = 10
/* 使用 if 语句判断布尔表达式 */
if a < 20 {
/* 如果条件为 true 则执行以下语句 */
fmt.Printf("a 小于 20\n")
}
fmt.Printf("a 的值为 : %d\n", a)
fmt.Println(pow(2, 3, 10))
fmt.Println(pow(3, 3, 20))
}
func pow(x, n, lim float64) float64 {
//if 语句可以在条件之前执行一个简单语句
if v := math.Pow(x, n); v < lim {
return v
} else {
//在if的便捷语句定义的变量同样可以在任何对应的else块中使用
fmt.Printf("%g >= %g\n", v, lim)
}
//这个地方就无法使用if中定义的变量v
return lim
}
DEMO:利用牛顿法 计算平方根
简化后 z = z/2 + x/2*z
/**
练习:循环和函数
作为练习函数和循环的简单途径,用牛顿法实现开方函数
*/
package main
import (
"fmt"
)
func Sqrt(x float64) float64 {
z := float64(1)
for i := 0; i < 1e+5; i++ {
z = z/2 + x/(2*z)
}
return z
}
func main() {
fmt.Println(Sqrt(4))
}
三、switch
switch 的条件从上到下的执行,当匹配成功的时候停止
没有条件的 switch 同
样例一:
package main
import (
"fmt"
"runtime"
)
func main() {
/* 定义局部变量 */
var grade string = "B"
var marks int = 90
switch marks {
case 90:
grade = "A"
case 80:
grade = "B"
case 50, 60, 70:
grade = "C"
default:
grade = "D"
}
switch {
case grade == "A":
fmt.Printf("优秀!\n")
case grade == "B", grade == "C":
fmt.Printf("良好\n")
case grade == "D":
fmt.Printf("及格\n")
case grade == "F":
fmt.Printf("不及格\n")
default:
fmt.Printf("差\n")
}
fmt.Printf("你的等级是 %s\n", grade)
fmt.Println(runtime.GOOS)
switch os := runtime.GOOS; os {
case "windows":
fmt.Println("system is " + os)
case "linux":
fmt.Println("Linux.")
default:
fmt.Printf("%s.", os)
}
}
样例二:
package main
import (
"fmt"
"time"
)
func main() {
var x interface{}
//switch 自上而下执行,当匹配成功的时候停止
switch i := x.(type) {
case nil:
fmt.Printf(" x 的类型 :%T", i)
case int:
fmt.Printf("x 是 int 型")
case float64:
fmt.Printf("x 是 float64 型")
case func(int) float64:
fmt.Printf("x 是 func(int) 型")
case bool, string:
fmt.Printf("x 是 bool 或 string 型")
default:
fmt.Printf("未知型")
}
fmt.Println("When's Saturday?")
today := time.Now().Weekday()
switch time.Saturday {
case today + 0:
fmt.Println("Today.")
case today + 1:
fmt.Println("Tomorrow.")
case today + 2:
fmt.Println("In two days.")
default:
fmt.Println("Too far away.")
}
//没有条件的switch 相当于if-then-else链
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("Good morning!")
case t.Hour() < 17:
fmt.Println("Good afternoon.")
default:
fmt.Println("Good evening.")
}
}
四、defer延时
defer 语句会延迟函数的执行直到上层函数返回
延迟调用的参数会立刻生成,但是在上层函数返回前函数都不会被调用
延迟的函数调用被压入一个栈中。当函数返回时, 会按照后进先出的顺序调用被延迟的函数调用
样例:
package main
import "fmt"
func main() {
//defer语句会延时函数的执行知道上层函数返回。
defer fmt.Println("world")
fmt.Println("hello")
i := 1
//延时调用的参数会立刻生成,但是在上层函数返回前函数都不会被调用
//延时的函数调用被压入一个栈中。当函数返回时,会按照后进先出的顺序调用被延迟的函数调用
defer fmt.Println(i)
i++
fmt.Println(i)
}
Go 只有一种循环结构——
for循环
for循环包含三个由分号分开的组成部分:
初始化语句 : 第一次循环执行前被执行 可选
循环条件表达式 : 每次迭代开始前被求值:false or true 必须
后置语句:每次迭代后执行 可选
样例一 常用循环:
package main
import "fmt"
func main() {
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum)
}
样例二 只保留循环条件表达式:
package main
import "fmt"
func main() {
sum := 1
for ; sum < 1000; {
sum += sum
}
fmt.Println(sum)
}
样例三 死循环:
package main
func main() {
for {
}
}
DEMO :
package main
import "fmt"
func main() {
var i, j int
//计算100以内的素数
for i = 2; i < 100; i++ {
for j = 2; j <= i/j; j++ {
if i%j == 0 {
break // 如果发现因子,则不是素数
}
}
if j > (i / j) {
fmt.Printf("%d 是素数\n", i)
}
}
//字符串反转
str := "hello world"
arr := []rune(str)
for i,j := 0,len(arr)-1;i<len(arr)/2;i,j = i+1,j-1{
arr[i],arr[j] = arr[j],arr[i]
}
fmt.Println(string(arr))
}
二、if
条件表达式
可以在条件之前执行一个简单语句,这个语句定义的变量的作用域仅在if范围之内
样例:
package main
import (
"fmt"
"math"
)
func main() {
/* 定义局部变量 */
var a int = 10
/* 使用 if 语句判断布尔表达式 */
if a < 20 {
/* 如果条件为 true 则执行以下语句 */
fmt.Printf("a 小于 20\n")
}
fmt.Printf("a 的值为 : %d\n", a)
fmt.Println(pow(2, 3, 10))
fmt.Println(pow(3, 3, 20))
}
func pow(x, n, lim float64) float64 {
//if 语句可以在条件之前执行一个简单语句
if v := math.Pow(x, n); v < lim {
return v
} else {
//在if的便捷语句定义的变量同样可以在任何对应的else块中使用
fmt.Printf("%g >= %g\n", v, lim)
}
//这个地方就无法使用if中定义的变量v
return lim
}
DEMO:利用牛顿法 计算平方根
简化后 z = z/2 + x/2*z
/**
练习:循环和函数
作为练习函数和循环的简单途径,用牛顿法实现开方函数
*/
package main
import (
"fmt"
)
func Sqrt(x float64) float64 {
z := float64(1)
for i := 0; i < 1e+5; i++ {
z = z/2 + x/(2*z)
}
return z
}
func main() {
fmt.Println(Sqrt(4))
}
三、switch
switch 的条件从上到下的执行,当匹配成功的时候停止
没有条件的 switch 同
switch true一样 相当于if-then-else
样例一:
package main
import (
"fmt"
"runtime"
)
func main() {
/* 定义局部变量 */
var grade string = "B"
var marks int = 90
switch marks {
case 90:
grade = "A"
case 80:
grade = "B"
case 50, 60, 70:
grade = "C"
default:
grade = "D"
}
switch {
case grade == "A":
fmt.Printf("优秀!\n")
case grade == "B", grade == "C":
fmt.Printf("良好\n")
case grade == "D":
fmt.Printf("及格\n")
case grade == "F":
fmt.Printf("不及格\n")
default:
fmt.Printf("差\n")
}
fmt.Printf("你的等级是 %s\n", grade)
fmt.Println(runtime.GOOS)
switch os := runtime.GOOS; os {
case "windows":
fmt.Println("system is " + os)
case "linux":
fmt.Println("Linux.")
default:
fmt.Printf("%s.", os)
}
}
样例二:
package main
import (
"fmt"
"time"
)
func main() {
var x interface{}
//switch 自上而下执行,当匹配成功的时候停止
switch i := x.(type) {
case nil:
fmt.Printf(" x 的类型 :%T", i)
case int:
fmt.Printf("x 是 int 型")
case float64:
fmt.Printf("x 是 float64 型")
case func(int) float64:
fmt.Printf("x 是 func(int) 型")
case bool, string:
fmt.Printf("x 是 bool 或 string 型")
default:
fmt.Printf("未知型")
}
fmt.Println("When's Saturday?")
today := time.Now().Weekday()
switch time.Saturday {
case today + 0:
fmt.Println("Today.")
case today + 1:
fmt.Println("Tomorrow.")
case today + 2:
fmt.Println("In two days.")
default:
fmt.Println("Too far away.")
}
//没有条件的switch 相当于if-then-else链
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("Good morning!")
case t.Hour() < 17:
fmt.Println("Good afternoon.")
default:
fmt.Println("Good evening.")
}
}
四、defer延时
defer 语句会延迟函数的执行直到上层函数返回
延迟调用的参数会立刻生成,但是在上层函数返回前函数都不会被调用
延迟的函数调用被压入一个栈中。当函数返回时, 会按照后进先出的顺序调用被延迟的函数调用
样例:
package main
import "fmt"
func main() {
//defer语句会延时函数的执行知道上层函数返回。
defer fmt.Println("world")
fmt.Println("hello")
i := 1
//延时调用的参数会立刻生成,但是在上层函数返回前函数都不会被调用
//延时的函数调用被压入一个栈中。当函数返回时,会按照后进先出的顺序调用被延迟的函数调用
defer fmt.Println(i)
i++
fmt.Println(i)
}
相关文章推荐
- Go语言学习(五)流程控制语句
- Go语言学习(五)流程控制语句
- go语言学习-流程控制
- go语言学习笔记(8) 流程控制
- Go语言学习笔记 --- 控制语句之if判断,循环语句for, switch语句和跳转语句
- Go语言学习笔记3——控制语句
- GO语言学习-流程控制
- Go语言学习(4)-流程控制
- 学习Go语言,关于流程控制
- Java学习笔记六:Java的流程控制语句之if语句
- Power Shell 学习笔记(六)流程控制语句之分支语句
- 大三学长带我学习JAVA.作业4.流程控制语句.续.Flow.Control.Statement.Cont 理解面向对象程序设计 学长带我学java的作业4
- pl/sql学习8——流程控制语句
- 黑马程序员——学习笔记03.java流程控制语句和函数
- 黑马程序员——Java语言基础(二)---程序流程控制语句、函数
- Scala 学习笔记(5)-流程控制语句
- LAMP兄弟连PHP课程学习笔记 第四天 流程控制分支语句
- (转)SQL流程控制语句学习(二):begin…end if…else case
- PL/SQL学习笔记[5]-流程控制语句
- Java学习笔记七:Java的流程控制语句之switch