2017-06-09 91 views
1
package main 

import ("fmt") 

func main() { 

    var bts []byte =nil 
    fmt.Println("the result :", string(bts)) // why not panic ? 
    // the result : 
} 

https://play.golang.org/p/dzRzzKvUyd將nil []字節變量轉換爲字符串不會恐慌。爲什麼不?

+2

語言規範的哪一部分表明這應該是恐慌? – Volker

+0

相關:[無片vs非零片vs Go語言中的空片](https://stackoverflow.com/questions/44305170/nil-slices-vs-non-nil-slices-vs-empty-slices-in -go語言/ 44305910#44305910)。 – icza

回答

1

通常,對於任何類型的可nil您可以生成任何字符串表示你喜歡!這是因爲在實施fmt.Stringer接口(請參閱here)或某種類型的任何功能(可以是nil)時,您可以使用接收器值nil。換句話說,與OOP語言相比,您可以調用nil對象上的方法。在this示例代碼中,當第二種類型的值爲nil時,您將看到ʕ◔ϖ◔ʔ hey nilo!,但當內部有元素(它僅打印第一個元素作爲示例代碼)時,將看到BOO DATA!!! :: Hi! :)

並再次記住nilis typed在去。

1

由於切片(nil)的零值的作用就像一個零長度的片。例如。你也可以聲明切片變量,然後追加到它在一個循環:

// Filter returns a new slice holding only 
// the elements of s that satisfy f() 
func Filter(s []int, fn func(int) bool) []int { 
    var p []int // == nil 
    for _, v := range s { 
     if fn(v) { 
      p = append(p, v) 
     } 
    } 
    return p 
} 

更多細節可以在這裏找到:https://blog.golang.org/go-slices-usage-and-internals

+0

你甚至可以對一個無切片進行切片,這真的很奇怪:'fmt.Printf(「wat:%v \ n」,([] byte(nil))[0:0])'不會恐慌。 – Adrian