golang 值得注意的地方(2則)

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

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部分組成, typevalue ,調用 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/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.