在Go中,var s[]int
和s:=make([]int,0)
之间有什么区别?
我发现两者都有效,但哪一个更好?
只是发现了一个不同。如果你用
var list []MyObjects
然后将输出编码为JSON,得到null
。
list := make([]MyObjects, 0)
结果[]
如预期的那样。
除了Fabriziom的回答之外,您还可以在Go Slices:用法和内部示例中看到更多示例,其中提到了对[]int
的使用:
由于切片的零值(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
}
这意味着,要附加到一个片,您不必首先分配内存:nil
slicepint[]
作为一个片就足够了。
简单声明
var s []int
不分配内存和s
指向nil
,而
s := make([]int, 0)
将内存和s
指向内存分配给一个包含0个元素的切片。
通常,如果您不知道用例的确切大小,那么第一个更为惯用。
问题内容: 在Golang中,和之间有什么区别? 我发现这两种方法都可行,但是哪一种更好? 问题答案: 除了fabriziom的答案外,您还可以在“转到切片:用法和内部方法”中看到更多示例,其中提到了的用法: 由于slice()的零值就像 零长度的slice一样 ,您可以声明slice变量,然后在循环中附加到该变量: 这意味着,要附加到切片,您不必先分配内存:切片足以作为要添加的切片。
问题内容: 我很好奇拆包切片并将其作为参数发送给可变参数函数。 假设我们有一个带有可变参数的函数: 如果我们不想传入一个接口,它就可以工作,那么我们是否拆包都没关系: 如果我们有一片片的话,那会很棘手。在这里,编译器不允许我们传递解压版本: 错误提示: 在解包参数中不能将sliceOfSlices(类型[] [] interface {})用作类型[] interface {} 我不知道为什么会这
取一个list或tuple的部分元素是非常常见的操作。比如,一个list如下: >>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] 取前3个元素,应该怎么做? 笨办法: >>> [L[0], L[1], L[2]] ['Michael', 'Sarah', 'Tracy'] 之所以是笨办法是因为扩展一下,取前N个元素就没辙了。 取前N个元素
举个例子 给你一个list 让你取前30个怎么办? a = [] # 很多数据 a[0],a[1] #按照这种方式吗?这也太复杂了! for i in a: pass ## 这种方式也是可以的,但是还是有点复杂了,在编程语言中,或者是我们的编程思想中,less is more是最重要的,也就是说,写的越少越好。 # 所以我们可以采用切片的方式 a[1:3],从第二个开始到第
取一个list或tuple的部分元素是非常常见的操作。比如,一个list如下: >>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] 取前3个元素,应该怎么做? 笨办法: >>> [L[0], L[1], L[2]] ['Michael', 'Sarah', 'Tracy'] 之所以是笨办法是因为扩展一下,取前N个元素就没辙了。 取前N个元素
问题内容: 我想知道我什么时候做类似的事情 创建新字符串或返回视图/迭代器 问题答案: Python会进行逐个切片,这意味着每次切片时(非常琐碎的切片(例如)除外),它都会将所有数据复制到一个新的字符串对象中。 根据一位开发人员的说法,之所以做出此选择是因为 [按引用切片]方法更复杂,更难实现并且可能导致意外行为。 例如: 使用“按切片复制”设计,可以立即释放字符串。尽管您只对第一个字符感兴趣,但