2017-06-19 3 views
-1

Ich habe so etwas wie die folgende Art Struktur unten hinzuzufügen. Die tatsächliche Funktion nimmt jedoch einen gewissen Wert an, führt einige Geschäftslogik aus und hängt dann die Elemente an. Ich stehe jedoch vor der Schwierigkeit, dass Änderungen am Slice innerhalb der Methode den Wert des Slices nicht auf externe Aufrufer ändern, da die Append-Methode einen neuen Slice zuweist, den die Aufrufer nicht sehen.möglich, eine Methode append zu einer Scheibe

Gibt es eine Möglichkeit, an die Scheibe in einer Methode anzuhängen oder sollte die Scheibe in eine Struktur oder etwas anderes eingewickelt werden?

package main 

import "fmt" 

type Element int 
type Set []*Element 

func (ptr *Set) AppendElements(elements []*Element) { 
    set := *ptr 
    set = append(set, elements...) 
} 

func main() { 
    i := Element(1) 
    var set Set 
    set.AppendElements([]*Element{&i}) 

    for _, el := range set { 
     fmt.Println(el) 
    } 
} 

Genauer gesagt, das obige druckt nichts.

+0

Sie haben ein '* Set' Zeiger, so dass Sie es ändern können. Es würde helfen, zu zeigen, wie es Ihnen gelingt, es nicht zu ändern. – JimB

+0

@JimB Die Append-Funktion funktioniert nicht mit Zeigern. Ein ausführbares Beispiel wird veröffentlicht. – xaav

Antwort

3

Sie ändern das Segment, aber Sie weisen es nie dem Zeiger zurück.

func (ptr *Set) AppendElements(elements []*Element) { 
    set := *ptr 
    set = append(set, elements...) 
    *ptr = set 
} 

Normalerweise obwohl, würde man den Zeiger dereferenzieren direkt in der append Anweisung:

func (set *Set) AppendElements(elements []*Element) { 
    *set = append(*set, elements...) 
} 
+0

Vielen Dank für diese Antwort, und entschuldigen Sie bitte meine Inkompetenz, da ich nicht viel Erfahrung mit C-Stil Sprachen hatte. – xaav

Verwandte Themen