- if
var number int
if number := 4; 100 > number { //标识符的重声明:只要对同一个标识符的两次声明各自
number += 3 所在的代码块之间存在包含的关系,就会形成对该标识
} else if 100 < number { 符的重声明。
number -= 2
} else {
fmt.Println("OK!")
} //执行后 第二个number为7 第一个为0
- switch
1:表达式switch语句 //带初始化语句 names := []string{"Golang", "Java", "Rust", "C"} switch name := names[0]; name { case "Golang": fmt.Println("A programming language from Google.") case "Rust": fmt.Println("A programming language from Mozilla.") default: fmt.Println("Unknown!") } 2:类型switch语句 v := 11 switch i := interface{}(v).(type) { //取变量的类型 interface{}($v).(type) case int, int8, int16, int32, int64: fmt.Printf("A signed integer: %d. The type is %T. \n", i, i) case uint, uint8, uint16, uint32, uint64: fmt.Printf("A unsigned integer: %d. The type is %T. \n", i, i) default: fmt.Println("Unknown!") }
fallthrough
。它既是一个关键字,又可以代表一条语句。fallthrough
语句可被包含在表达式switch
语句中的case
语句中。它的作用是使控制权流转到下一个case
。不过要注意,fallthrough
语句仅能作为case
语句中的最后一条语句出现。并且,包含它的case
语句不能是其所属switch
语句的最后一条case
语句。 - for
map1 := map[int]string{1: "Golang", 2: "Java", 3: "Python", 4: "C"} for k,v := range map1 { fmt.Printf("%d: %s \n",k,v) }
- select
select
语句属于条件分支流程控制方法,不过它只能用于通道。它可以包含若干条case
语句,并根据条件选择其中的一个执行。进一步说,select
语句中的case
关键字只能后跟用于通道的发送操作的表达式以及接收操作的表达式或语句。
如果一条select
语句中不存在default case
, 并且在被执行时其中的所有case
都不满足执行条件,那么它的执行将会被阻塞!当前流程的进行也会因此而停滞。直到其中一个case
满足了执行条件,执行才会继续。我们一直在说case
执行条件的满足与否取决于其操作的通道在当时的状态。这里特别强调一点,即:未被初始化的通道会使操作它的case
永远满足不了执行条件。对于针对它的发送操作和接收操作来说都是如此。
break
语句也可以被包含在select
语句中的case
语句中。它的作用是立即结束当前的select
语句的执行,不论其所属的case
语句中是否还有未被执行的语句。
//输出 No Data 1 End.
ch4 := make(chan int, 1)
for i := 0; i < 4; i++ {
select {
case e, ok := <-ch4:
if !ok {
fmt.Println("End.")
return
}
fmt.Println(e)
default:
fmt.Println("No Data!")
}
}
- defer
defer
语句仅能被放置在函数或方法中。它由关键字defer
和一个调用表达式组成。当一个函数中存在多个defer
语句时,它们携带的表达式语句的执行顺序一定是它们的出现顺序的倒序。
//会输出回文 0 1 1 2 3 5 8 13 21 34 34 21 13 8 5 3 2 1 1 0
func main() {
for i := 0; i < 10; i++ {
defer func(n int) {
fmt.Printf("%d ", n)
}(func() int {
n := fibonacci(i)
fmt.Printf("%d ", n)
return n
}())
}
}
func fibonacci(num int) int {
if num == 0 {
return 0
}
if num < 2 {
return 1
}
return fibonacci(num-1) + fibonacci(num-2)
}
- error
type error interface {
Error() string
}
errors.New
是一个很常用的函数。在Go语言标准库的代码包中有很多由此函数创建出来的错误值,比如os.ErrPermission
、io.EOF
等变量的值
error
是Go语言内置的一个接口类型
- panic
panic
可被意译为运行时恐慌
内建函数panic
和recover
是天生的一对。前者用于产生运行时恐慌,而后者用于“恢复”它。不过要注意,recover
函数必须要在defer
语句中调用才有效。因为一旦有运行时恐慌发生,当前函数以及在调用栈上的所有代码都是失去对流程的控制权。只有defer
语句携带的函数中的代码才可能在运行时恐慌迅速向调用栈上层蔓延时“拦截到”它。
defer func() {
if p := recover(); p != nil {
fmt.Printf("Fatal error: %s\n", p)
}
}()
- go