【问题标题】:Convert nil []byte variable to string doesn't panic. Why not?将 nil []byte 变量转换为字符串不会恐慌。为什么不?
【发布时间】:2017-11-11 07:38:33
【问题描述】:
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

【问题讨论】:

标签: go


【解决方案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

【讨论】:

  • 你甚至可以切片一个 nil 切片,这真的很奇怪:fmt.Printf("wat: %v\n", ([]byte(nil))[0:0]) 并不恐慌。
【解决方案2】:

一般来说,对于可以是nil 的任何类型,您都可以生成任何您喜欢的字符串表示形式!这是因为在实现fmt.Stringer 接口(参见here)或任何可以是nil 的类型的函数时,您可以使用nil 作为接收器值。换句话说,与 OOP 语言相比,您可以在 nil 对象上调用方法。在this 示例代码中,您将看到ʕ◔ϖ◔ʔ hey nilo! 表示第二种类型的nil 值,但当您有一个元素时BOO DATA!!! :: Hi! :)(它只打印第一个元素作为示例代码)。

再一次记住nilis typed

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2015-06-13
    • 2012-07-06
    相关资源
    最近更新 更多