2015-03-20 13 views
7

Czy to możliwe dzięki golangowi, że metoda dynamicznie czyści wartości instancji struktury? btw Im new to golang.Czy mogę dynamicznie usuwać wartości instancji typu struct w golang?

type A struct { 
    Name string 
    Level int 
} 

type B struct { 
    Skill string 
} 

func main() { 
    a := A{"Momo", 1} 
    b := B{"Starfall"} 

    // outputs 
    // {"Momo", 1} 
    // {"Starfall"} 

    clear(a) 
    clear(b) 

    // outputs 
    // { , 0} 
    // { } 
} 

func clear(v interface{}) { 
    // some code 
} 
+2

Jak nie podajesz wskaźnika, funkcja, która zwraca nic, nie może wyczyścić a, ponieważ nie zna a, tylko kopię wartości. –

+5

Wystarczy przypisać wartość zerową, taką jak ta 'a = A {}', która jest znacznie prostsza i bardziej czytelna. – Volker

+0

technicznie wartość interfejsu * jest * typem odniesienia. Tak więc wyraźna funkcja, jak to napisał, może usunąć strukturę. Jednak musiałby dużo refleksji. O wiele łatwiej jest po prostu użyć wartości zerowej, jak powiedzieli inni. –

Odpowiedz

14

Nie można modyfikować oryginalnych wartości bez przekazywania do nich wskaźnika.

O wiele prostsze i łatwiejsze jest przypisanie nowej wartości zerowej do kodu. Jeśli twoje typy są bardziej złożone, możesz zastąpić te wartości konstruktorem lub dostarczyć metodom Reset() metody dla typów za pomocą odbiornika wskaźnika.

Jeśli naprawdę chcesz zobaczyć, jak to zrobić za pośrednictwem refleksji, czynność clear mógłby wyglądać następująco: http://play.golang.org/p/g0zIzQA06b

func clear(v interface{}) { 
    p := reflect.ValueOf(v).Elem() 
    p.Set(reflect.Zero(p.Type())) 
} 

(Spowoduje to panikę, jeśli przechodzą w wartości innej niż wskaźnik)

+0

FYI, zamiast metody "Clear()" istnieje precedens w standardowej bibliotece używania 'Reset()'. Na przykład. ['bytes.Buffer'] (https://golang.org/pkg/bytes/#Buffer.Reset), [' hash.Hash'] (https://golang.org/pkg/hash/#Hash), itd. –

+0

@DaveC: dobry punkt – JimB

+0

Wygląda na to, że funkcja clear nie działa dla typu string: "reflect: call of reflect.Value.Elem na ciągu znaków Value" – thinkhy