หากต้องการประกาศชิ้นว่างเปล่าที่มีขนาดไม่คงที่จะทำอย่างไรดีกว่า:
mySlice1 := make([]int, 0)
หรือ:
mySlice2 := []int{}
แค่สงสัยว่าอันไหนเป็นวิธีที่ถูกต้อง
หากต้องการประกาศชิ้นว่างเปล่าที่มีขนาดไม่คงที่จะทำอย่างไรดีกว่า:
mySlice1 := make([]int, 0)
หรือ:
mySlice2 := []int{}
แค่สงสัยว่าอันไหนเป็นวิธีที่ถูกต้อง
คำตอบ:
ทางเลือกสองทางที่คุณให้มามีความหมายเหมือนกัน แต่การใช้make([]int, 0)
จะส่งผลให้เกิดการเรียกภายในไปยังruntime.makeslice (ไป 1.14)
คุณมีตัวเลือกที่จะปล่อยให้มันมีnil
ค่า:
var myslice []int
ดังที่เขียนไว้ในบล็อก Golang.org :
ชิ้นศูนย์จะทำหน้าที่เทียบเท่ากับชิ้นศูนย์ที่มีความยาวแม้ว่ามันจะชี้ไปที่อะไรก็ตาม มันมีความยาวเป็นศูนย์และสามารถผนวกเข้ากับการจัดสรร
nil
อย่างไรก็ตามจะมีการแบ่งส่วนjson.Marshal()
ใน"null"
ขณะที่ส่วนที่ว่างเปล่าจะจัดเข้า"[]"
ตำแหน่งตาม @farwayer
ไม่มีตัวเลือกใด ๆ ด้านบนที่จะทำให้เกิดการจัดสรรตามที่ระบุโดย @ArmanOrdookhani
json.Marshal()
จะกลับมาnull
สำหรับvar myslice []int
และ[]
สำหรับชิ้นที่เริ่มmyslice := []int{}
reflect.DeepEqual
ทำให้ความแตกต่างระหว่างชิ้นศูนย์และชิ้นไม่ใช่ศูนย์: a := []int{}
, var b []int
,reflect.DeepEqual(a, b) // returns false
พวกเขาเทียบเท่า ดูรหัสนี้:
mySlice1 := make([]int, 0)
mySlice2 := []int{}
fmt.Println("mySlice1", cap(mySlice1))
fmt.Println("mySlice2", cap(mySlice2))
เอาท์พุท:
mySlice1 0
mySlice2 0
ทั้งสองชิ้นมี0
ความจุซึ่งหมายถึงทั้งสองชิ้นมี0
ความยาว (ไม่เกินความสามารถ) ซึ่งหมายความว่าทั้งสองชิ้นไม่มีองค์ประกอบ ซึ่งหมายความว่า 2 ชิ้นเหมือนกันในทุกด้าน
ดูคำถามที่คล้ายกัน:
อะไรคือจุดของการไม่มีศูนย์และชิ้นส่วนเปล่าในโกลัน?
ไม่มีส่วนใดเทียบกับส่วนที่ไม่ใช่แบบไม่มีส่วนเทียบกับส่วนที่ว่างในภาษาโก
เป็นส่วนเสริมของ@ANisus 'คำตอบ ...
ด้านล่างเป็นข้อมูลบางส่วนจากหนังสือ"ดำเนินการ"ซึ่งฉันคิดว่าน่าพูดถึง:
nil
& empty
ชิ้นถ้าเราคิดถึงชิ้นเช่นนี้:
[pointer] [length] [capacity]
แล้ว:
nil slice: [nil][0][0]
empty slice: [addr][0][0] // points to an address
ไม่มีชิ้น
มันมีประโยชน์เมื่อคุณต้องการแสดงชิ้นที่ไม่มีอยู่เช่นเมื่อมีข้อยกเว้นเกิดขึ้นในฟังก์ชันที่ส่งคืนชิ้นงาน
// Create a nil slice of integers. var slice []int
ชิ้นที่ว่างเปล่า
ชิ้นส่วนที่ว่างเปล่ามีประโยชน์เมื่อคุณต้องการแสดงคอลเลกชันที่ว่างเปล่าเช่นเมื่อแบบสอบถามฐานข้อมูลส่งคืนผลลัพธ์เป็นศูนย์
// 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
make
หรือไม่?
ชิ้นส่วนเปล่าและชิ้นส่วนเปล่าจะเริ่มต้นได้แตกต่างกันในโก:
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 และฝาเป็น 0
make([]int, 0)
เป็นดีที่สุดเพราะ Jetbrains Goland ไม่บ่นเกี่ยวกับมันเป็น "ไม่จำเป็น" []int{}
เช่นเดียวกับในกรณีของ สิ่งนี้มีประโยชน์ในการเขียนการทดสอบหน่วย
keys := make([]int, 0, len(m)); for k, v := range m { keys := append(keys,k) }