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. 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.
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?
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
, icap
działają tak samo.
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
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.
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