it-swarm.asia

الطريقة الصحيحة لتهيئة شريحة فارغة

لإعلان شريحة فارغة ، بحجم غير ثابت ، هل من الأفضل القيام بما يلي:

mySlice1 := make([]int, 0)

أو:

mySlice2 := []int{}

فقط أتساءل أي واحد هو الطريق الصحيح.

153
eouti

البديلان اللذان قدمتهما متطابقان تمامًا ، وأفترض أنهما ينتجان نفس تعليمات التجميع.

لتجنب تخصيص غير ضروري ، في حال انتهى بك الأمر إلى عدم استخدام الشريحة ، يمكنك تركها بقيمة nil:

var myslice []int

كما هو مكتوب في Golang.org blog :

شريحة nil تعادل وظيفيًا شريحة ذات طول صفري ، على الرغم من أنها لا تشير إلى أي شيء. طوله صفر ويمكن إلحاقه ، مع تخصيص.

197
ANisus

هم متساوون. انظر هذا الكود:

mySlice1 := make([]int, 0)
mySlice2 := []int{}
fmt.Println("mySlice1", cap(mySlice1))
fmt.Println("mySlice2", cap(mySlice2))

انتاج:

mySlice1 0
mySlice2 0

يشتمل كل من الشريحتين على 0 سعة مما يعني أن كلا الشريحتين له 0 طول (لا يمكن أن يكون أكبر من السعة) مما يعني أن كلا الشريحتين ليس لهما عناصر. هذا يعني أن الشريحتين متطابقتان في كل جانب.

انظر أسئلة مماثلة:

ما هي الفائدة من وجود شريحة فارغة وشريحة فارغة في جولانج؟

nil slices vs non-nil slices vs the blanks in Go go

45
icza

كإضافة إلى 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
29
tgogos

تتم تهيئة شريحة فارغة وشريحة فارغة بشكل مختلف في 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

أما بالنسبة للشرائح الثلاث ، فالون والغطاء هما 0.

11
Joe.CK