這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
golang 的文法和使用方式都非常簡單明了,沒有花哨的文法糖,也沒有多餘的關鍵字。
但是即使是這麼簡潔的語言,仍然有一些不那麼直白,需要注意的地方,比如下面2點。
interface 賦值 nil Pointer 之後,變成 non-nil
package mainimport ( "bytes" "fmt" "io")func main() { var b *bytes.Buffer if b == nil { fmt.Println("b is nil") } f(b)}func f(out io.Writer) { if out == nil { fmt.Println("nil") } else { fmt.Println("no-nil") // out.Write([]byte("xxxx")) // there will cause panic }}
interface 由2部分組成, type 和 value ,調用 func f 的時候,out 的 type 設定為 *bytes.Buffer, value 設定為 nil。
此時 out != nil,因為雖然 out 的 value == nil, 但是 type !=nil
在寫代碼時如果不注意這裡,很容易導致運行時的 panic
類型判斷的傳回值有 2 種
golang 中可以通過類型判斷來進行轉型。
類型判斷時,轉型的代碼可以返回一個值,也可以返回2個值(附加判斷結果 ok)。
package mainimport ( "fmt" "io" "os")func main() { var w io.Writer w = os.Stdout rw, ok := w.(*os.File) // 可以正常執行 // rw := w.(*os.File) // 也可以正常執行 fmt.Println(rw, ok)}
同一段代碼的傳回值,卻有2種情況,channel和map也有上面的現象:(如以下代碼都是正確的)
var val = map["key"]var val, ok = map["key"]var val = <- chvar val, ok = <- ch
這種文法的實現簡單來說,就是 golang 在類型判斷時,會根據文法樹檢查 = 左邊是否有 comma(也就是逗號),如果有的話就返回2個值,沒有就返回一個值。
具體可以參考:http://stackoverflow.com/questions/30129206/golang-return-multiple-values-issue/30135334
blog 來源:http://blog.iotalabs.io/golang-zhi-de-zhu-yi-de-di-fang-2ze/