2016-05-18 13 views
1

Ich habe mit Scheiben experimentieren. Hier ist ein BeispielprogrammWachsen eine Scheibe, während seine Subslice um

for n := 1; n <= 10; n++ { 
    a := make([]int, 0) 
    for j := 0; j < n; j++ { 
     a = append(a, 0) 
    } 
    b := a[:1] 
    a = append(a, 0) 
    a[0] = 1 
    fmt.Println(n, b[0]) 
} 

Der Ausgang ist

1 0 
2 0 
3 1 
4 0 
5 1 
6 1 
7 1 
8 0 
9 1 
10 1 

Ich verstehe, was hier vor sich geht. Die Zeile a = append(a, 0) weist ein neues Array zu, wenn das alte Array keine ausreichende Länge hat und das neue Array die doppelte Länge wie das Original hat. Deshalb, wenn n eine Potenz von 2, die Linie

a[0] = 1 

nicht das Array von b als neues Array gesichert ändern wurden, bevor in der Zeile zugeordnet.

Allerdings konnte ich in der Dokumentation keine explizite Aussage finden, dass das neu zugewiesene Array immer doppelt so lang ist. Bedeutet dies, dass mein Code implementierungsabhängig ist? Ist es eine schlechte Übung, auf diese Weise ein Slice eines anderen Slices in einer Variablen zu speichern, oder sollte ich einfach jedes Mal a[j:k] machen, wenn ein Subslice benötigt wird?

Antwort

1

Sie kennen die Antwort bereits.

  • Es ist abhängig von der Implementierung
  • Es ist eine schlechte Praxis zu sub-Slice auf eine var, wenn Sie eine zugrunde liegende Array ändern/Scheibe
  • Sie besser explizit Unter Schneiden zu verwenden, wann immer erforderlich - es ist billig .

Gute Frage, obwohl. Danke für das Teilen.

2

Die Verdoppelung der Größe des zugrunde liegenden Arrays ist ein Implementierungsdetail (und gilt nicht mehr, sobald die Größe in der aktuellen Implementierung einen bestimmten Schwellenwert erreicht). Sie können sich also nicht darauf verlassen, b[0] selektiv zu ändern oder nicht.

Leider verstehe ich Ihre letzten zwei Fragen nicht. Nichts ist falsch mit Subslicing und es hängt nicht von expliziten (a[i:k]) oder impliziten Start-oder Stop-Indizes (a[i:] oder a[:k]) ab, da dies völlig gleich ist.

+1

Meine letzten 2 Fragen sind nicht besonders klar, ich stimme zu. Ich habe versucht, herauszufinden, ob es idiomatisch ist, einen Unterschnitt einer Scheibe in eine Variable für den späteren Gebrauch zu legen. Das ist fragil, weil Zwischenoperationen die Elemente des Slice möglicherweise verändert haben oder auch nicht. –

Verwandte Themen