Để khai báo một lát trống, với kích thước không cố định, tốt hơn là làm:
mySlice1 := make([]int, 0)
hoặc là:
mySlice2 := []int{}
Chỉ cần tự hỏi cái nào là cách chính xác.
Để khai báo một lát trống, với kích thước không cố định, tốt hơn là làm:
mySlice1 := make([]int, 0)
hoặc là:
mySlice2 := []int{}
Chỉ cần tự hỏi cái nào là cách chính xác.
Câu trả lời:
Hai phương án bạn đưa ra giống hệt nhau về mặt ngữ nghĩa, nhưng việc sử dụng make([]int, 0)
sẽ dẫn đến một cuộc gọi nội bộ đến runtime.makeslice (Go 1.14).
Bạn cũng có tùy chọn để lại nó với một nil
giá trị:
var myslice []int
Như được viết trong blog Golang.org :
một lát cắt không có chức năng tương đương với một lát cắt có độ dài bằng không, mặc dù nó chỉ ra không có gì. Nó có độ dài bằng 0 và có thể được thêm vào, với sự phân bổ.
nil
Tuy nhiên, một lát sẽ json.Marshal()
thành "null"
một lát trống"[]"
, như được chỉ ra bởi @farwayer.
Không có tùy chọn nào ở trên sẽ gây ra bất kỳ sự phân bổ nào, như được chỉ ra bởi @ArmanOrdookhani.
json.Marshal()
sẽ trở lại null
cho var myslice []int
và []
cho lát khởi tạomyslice := []int{}
reflect.DeepEqual
làm cho một sự phân biệt giữa lát bằng không và dừng lát phi nil: a := []int{}
, var b []int
,reflect.DeepEqual(a, b) // returns false
Chúng là tương đương. Xem mã này:
mySlice1 := make([]int, 0)
mySlice2 := []int{}
fmt.Println("mySlice1", cap(mySlice1))
fmt.Println("mySlice2", cap(mySlice2))
Đầu ra:
mySlice1 0
mySlice2 0
Cả hai lát có 0
khả năng ngụ ý cả hai lát có0
độ dài (không thể lớn hơn dung lượng) ngụ ý cả hai lát không có phần tử. Điều này có nghĩa là 2 lát giống hệt nhau ở mọi khía cạnh.
Xem các câu hỏi tương tự:
Là một bổ sung cho câu trả lời của @ANisus ...
dưới đây là một số thông tin từ cuốn sách "Hành động" , mà tôi nghĩ là đáng nói:
nil
& empty
látNếu chúng ta nghĩ về một lát như thế này:
[pointer] [length] [capacity]
sau đó:
nil slice: [nil][0][0]
empty slice: [addr][0][0] // points to an address
nil lát
Chúng rất hữu ích khi bạn muốn biểu diễn một lát cắt không tồn tại, chẳng hạn như khi một ngoại lệ xảy ra trong một hàm trả về một lát.
// Create a nil slice of integers. var slice []int
lát trống
Các lát trống hữu ích khi bạn muốn biểu diễn một bộ sưu tập trống, chẳng hạn như khi truy vấn cơ sở dữ liệu trả về kết quả bằng không.
// 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{}
Cho dù bạn đang sử dụng một lát nil hoặc một lát rỗng, được xây dựng trong chức năng
append
,len
vàcap
công việc tương tự.
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))
}
in:
true 0 0
false 0 0
make
không?
Lát rỗng và lát cắt không được khởi tạo khác nhau trong 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
Đối với cả ba lát, len và nắp là 0.
make([]int, 0)
là tốt nhất vì Jetbrains GoLand không phàn nàn về việc nó "không cần thiết" như trong trường hợp []int{}
. Điều này rất hữu ích trong việc viết bài kiểm tra đơn vị.
keys := make([]int, 0, len(m)); for k, v := range m { keys := append(keys,k) }