【问题标题】:How to make slice with dynamic size/length/capacity如何制作具有动态大小/长度/容量的切片
【发布时间】:2020-03-07 23:23:55
【问题描述】:

我似乎能够创建一个具有动态大小/容量/长度/无论使用什么的切片:

cleaned := []interface{}{}

我怎样才能对make() 做同样的事情?我试过这个:

cleaned := make([]interface{})

但它希望我包含一个长度?

make 缺少 len 参数

【问题讨论】:

  • 如果你想要一个空切片,那么你不需要使用make。为什么你认为 make 是必需的?
  • jetbrains 抱怨说 Empty slice declaration via literal 并建议替换为 var cleaned []interface{} ,但不清楚为什么?
  • Jet brains 试图暗示如果它是空的,你应该把它留空。
  • @OlegzandrDenman:您的 Jetbrains 问题是一个不同的问题。在 Stack Overflow 上,您应该提出一个新问题。 (有关原因,请参阅我修改后的答案。)

标签: arrays go slice goland


【解决方案1】:

你有两种方法:

  1. 使用cleaned := make([]interface{},0) 而不是调用cleaned = append(cleaned, your_data)
  2. 声明一个空数组:var cleaned []interface{}{}

【讨论】:

    【解决方案2】:
    cleaned := []interface{}{}
    

    我怎样才能用 make() 做同样的事情?


    例如,

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        {
            cleaned := []interface{}{}
            fmt.Println(len(cleaned), cap(cleaned), cleaned)
        }
    
        // OR
    
        {
            cleaned := make([]interface{}, 0)
            fmt.Println(len(cleaned), cap(cleaned), cleaned)
        }
    
        // OR
    
        {
            cleaned := make([]interface{}, 0, 0)
            fmt.Println(len(cleaned), cap(cleaned), cleaned)
        }
    }
    

    游乐场:https://play.golang.org/p/qndsxIKWjEp

    输出:

    0 0 []
    0 0 []
    0 0 []
    

    参考:

    The Go Programming Language Specification:Making slices, maps and channe



    评论:jetbrains 抱怨说空切片声明通过 文字并建议用 var clean []interface{} 替换,但是 目前还不清楚为什么? ——奥列格赞德·丹曼


    这是一个不同的问题。原因很清楚。

    Go Code Review Comments : Declaring Empty Slices

    当声明一个空切片时,首选

    var t []string
    

    结束

    t := []string{}
    

    前者声明一个 nil 切片值,而后者是非 nil 但 零长度。它们在功能上是等价的——它们的 len 和 cap 是 两者都为零——但 nil 切片是首选样式。

    。 . .

    例如,

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        {
            cleaned := []interface{}{}
            fmt.Println(len(cleaned), cap(cleaned), cleaned, cleaned == nil)
        }
    
        // OR
    
        {
            cleaned := make([]interface{}, 0)
            fmt.Println(len(cleaned), cap(cleaned), cleaned, cleaned == nil)
        }
    
        // OR
    
        {
            cleaned := make([]interface{}, 0, 0)
            fmt.Println(len(cleaned), cap(cleaned), cleaned, cleaned == nil)
        }
    
        // OR
    
        {
            var cleaned []interface{}
            fmt.Println(len(cleaned), cap(cleaned), cleaned, cleaned == nil)
        }
    }
    

    游乐场:https://play.golang.org/p/9cZOOS2F9qI

    输出:

    0 0 [] false
    0 0 [] false
    0 0 [] false
    0 0 [] true
    

    【讨论】:

      猜你喜欢
      • 2016-08-09
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 2020-05-05
      相关资源
      最近更新 更多