Poprawny sposób inicjalizacji pustego plasterka

Aby zadeklarować pusty kawałek, o niestandardowym rozmiarze, czy lepiej zrobić:

mySlice1 := make([]int, 0)

Lub:

mySlice2 := []int{}
Zastanawiam się, który z nich jest właściwy.
Author: Tim Cooper, 2015-03-20

4 answers

Dwie alternatywy, które podałeś, są semantycznie identyczne, ale użycie {[1] } spowoduje wewnętrzne wywołanie do runtime.makeslice (Go 1.14).

Masz również możliwość pozostawienia go z nil wartością:

var myslice []int

Jak napisano w Golang.org blog :

Kawałek zerowy jest funkcjonalnie równoważny kawałkowi o zerowej długości, mimo że nie wskazuje na nic. Ma długość zero i może być dołączony do, z alokacją.

A nil slice zamieni się jednak json.Marshal() w "null", podczas gdy pusty slice zamieni się w "[]", Jak zauważył @farwayer.

Żadna z powyższych opcji nie spowoduje żadnej alokacji, jak zauważył @ArmanOrdookhani.

 315
Author: ANisus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-21 15:39:54

Są równoważne. Zobacz ten kod:

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

Wyjście:

mySlice1 0
mySlice2 0

Oba plastry mają 0 pojemność, co oznacza, że oba plastry mają 0 długość (nie może być większa niż pojemność), co oznacza, że oba plastry nie mają elementów. Oznacza to, że 2 plastry są identyczne pod każdym względem.

Zobacz podobne pytania:

Jaki jest sens posiadania zerowego i pustego plasterka w golangu?

Nil plastry vs non-nil plastry vs puste plastry w Go język

 75
Author: icza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-22 10:18:01

Jako dodatek do @ANisus' odpowiedz..

Poniżej kilka informacji z książki "Go in action", o której myślę, że warto wspomnieć:

Różnica między nil & empty plastry

Jeśli pomyślimy o takim kawałku:

[pointer] [length] [capacity]

Potem:

nil slice:   [nil][0][0]
empty slice: [addr][0][0] // points to an address

Nil slice

Są użyteczne, gdy chcesz reprezentować kawałek, który nie istnieje, na przykład gdy występuje wyjątek w funkcji zwracającej plaster.

// Create a nil slice of integers.
var slice []int

Pusty kawałek

Puste plasterki są przydatne, gdy chcesz reprezentować pustą kolekcję, na przykład gdy zapytanie do bazy danych zwraca zero wyników.

// 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{}

Niezależnie od tego, czy używasz zerowego czy pustego plasterka, wbudowane funkcje append, len, i cap działają tak samo.


Go playground example :

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))

}

Druki:

true 0 0
false 0 0
 51
Author: tgogos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-07 10:08:42

Empty slice i nil slice są inicjalizowane inaczej w 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

Jak dla wszystkich trzech plastrów, len i cap są równe 0.

 17
Author: Joe.CK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-09 15:43:49