ใน Go ความแตกต่างระหว่างvar s []int
และs := make([]int, 0)
คืออะไร?
ฉันพบว่าทั้งสองได้ผล แต่อันไหนดีกว่ากัน?
ใน Go ความแตกต่างระหว่างvar s []int
และs := make([]int, 0)
คืออะไร?
ฉันพบว่าทั้งสองได้ผล แต่อันไหนดีกว่ากัน?
คำตอบ:
นอกจากคำตอบของfabriziomแล้วคุณสามารถดูตัวอย่างเพิ่มเติมได้ที่ " Go Slices: การใช้งานและภายใน " ซึ่งกล่าวถึงการใช้งาน:[]int
เนื่องจากค่าศูนย์ของ slice (
nil
) ทำหน้าที่เหมือนชิ้นส่วนที่มีความยาวเป็นศูนย์คุณสามารถประกาศตัวแปร slice แล้วผนวกเข้ากับมันในลูป:
// 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
ชิ้นส่วนp int[]
นั้นเพียงพอสำหรับชิ้นส่วนที่จะเพิ่มเข้าไป
var p []int
ง่ายกว่าการใช้make
(ซึ่งฉันเชื่อมโยงกับการจัดสรรมากกว่าแม้ว่าจะมีขีด จำกัด 0 แต่ก็จะไม่จัดสรรอะไรเลย) ในแง่ของความสามารถในการอ่านฉันไม่ต้องการใช้make
ที่นี่
p := []int{}
) เนื่องจากโดยปกติแล้วเราจะใช้:=
ไวยากรณ์เพื่อประกาศตัวแปรส่วนใหญ่จึงเป็นเรื่องธรรมดาที่จะมีทุกที่แทนที่จะมีข้อยกเว้นสำหรับชิ้นส่วน นอกเหนือจากนี้การพยายามคิดถึงการจัดสรรมักจะผลักดันให้ผู้คนไปสู่การเพิ่มประสิทธิภาพก่อนเวลาอันควร
ประกาศง่ายๆ
var s []int
ไม่จัดสรรหน่วยความจำและs
ชี้ไปnil
ในขณะที่
s := make([]int, 0)
จัดสรรหน่วยความจำและs
ชี้ไปยังหน่วยความจำให้กับชิ้นส่วนที่มี 0 องค์ประกอบ
โดยปกติอันแรกจะเป็นสำนวนมากกว่าหากคุณไม่ทราบขนาดที่แน่นอนของกรณีการใช้งานของคุณ
make
แผนที่เพราะแม้แต่พื้นที่ว่างก็ยังmap
ต้องการพื้นที่ว่างสำหรับการทำบัญชี
nil
ในกรณีที่ชิ้นส่วนของคุณไม่มีองค์ประกอบใด ๆ แทนที่จะเป็นอาร์เรย์ว่างเปล่า อย่างไรก็ตามหากmake
ใช้เพื่อสร้างชิ้นส่วนอาร์เรย์ว่างจะถูกส่งกลับแทนซึ่งโดยทั่วไปแล้วจะเป็นเอฟเฟกต์ที่ต้องการ
var s []int
) จะผลิตnull
ในขณะที่ marshaling the empty slice ( s := make([]int, 0)
) จะให้ผลตามที่คาดหวัง[]
เพิ่งพบความแตกต่าง ถ้าคุณใช้
var list []MyObjects
และจากนั้นคุณเข้ารหัสออกเป็น JSON null
คุณจะได้รับ
list := make([]MyObjects, 0)
ผลลัพธ์[]
เป็นไปตามที่คาดไว้
สมบูรณ์มากขึ้นเล็กน้อย (อีกหนึ่งอาร์กิวเมนต์ในmake
) ตัวอย่าง:
slice := make([]int, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
ออก:
length: 2 - capacity 5 - content: [0 0]
หรือด้วยประเภทไดนามิกของslice
:
slice := make([]interface{}, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
ออก:
length: 2 - capacity 5 - content: [<nil> <nil>]
nil
ไลซ์ในขณะที่อันที่สองสร้างสempty
ไลซ์ (นี่คือคำศัพท์ที่ใช้ในหนังสือ "Go in action book" ) เพื่อหลีกเลี่ยงการโพสต์คำตอบเดียวกันที่นี่ด้วยคุณสามารถตรวจสอบstackoverflow.com/a/45997533/1561148