要声明具有非固定大小的空切片,最好是:
mySlice1 := make([]int, 0)
要么:
mySlice2 := []int{}
只是想知道哪一个是正确的方法.
ANi*_*sus 228
你给出的两个替代方案在语义上是相同的,我会假设他们生成相同的汇编指令.
为避免不必要的分配,如果您最终不使用切片,可以为其保留一个nil值:
var myslice []int
正如Golang.org博客中所写:
nil切片在功能上等同于零长度切片,即使它指向任何东西.它的长度为零,可以通过分配附加到.
icz*_*cza 54
它们是等价的.看到这段代码:
mySlice1 := make([]int, 0)
mySlice2 := []int{}
fmt.Println("mySlice1", cap(mySlice1))
fmt.Println("mySlice2", cap(mySlice2))
输出:
mySlice1 0
mySlice2 0
两个切片都具有0容量,这意味着两个切片都具有0长度(不能大于容量),这意味着两个切片都没有元素.这意味着2个切片在每个方面都是相同的.
看到类似的问题:
tgo*_*gos 37
作为@ANisus回答的补充......
以下是"Go in action"一书中的一些信息,我认为值得一提:
nil和empty切片之间的区别如果我们想到这样的切片:
[pointer] [length] [capacity]
然后:
nil slice:   [nil][0][0]
empty slice: [addr][0][0] // points to an address
零切片
当您想要表示不存在的切片时,它们很有用,例如在返回切片的函数中发生异常时.
Run Code Online (Sandbox Code Playgroud)// Create a nil slice of integers. var slice []int空切片
当您想要表示空集合时,例如当数据库查询返回零结果时,空切片很有用.
Run Code Online (Sandbox Code Playgroud)// Use make to create an empty slice of integers. slice := make([]int, 0) // Use a slice literal to create an empty slice of integers. slice := []int{}不管您使用的是零片或空片,内置的功能
append,len和cap工作一样.
package main
import (
    "fmt"
)
func main() {
    var nil_slice []int
    var empty_slice = []int{}
    fmt.Println(nil_slice == nil, len(nil_slice), cap(nil_slice))
    fmt.Println(empty_slice == nil, len(empty_slice), cap(empty_slice))
}
打印:
true 0 0
false 0 0
Joe*_*.CK 13
在Go中,空切片和零切片的初始化方式不同:
var nilSlice []int 
emptySlice1 := make([]int, 0)
emptySlice2 := []int{}
fmt.Println(nilSlice == nil)    // true
fmt.Println(emptySlice1 == nil) // false
fmt.Println(emptySlice2 == nil) // false
对于所有三个切片,len和cap为0.
| 归档时间: | 
 | 
| 查看次数: | 166969 次 | 
| 最近记录: |