2017-03-09 9 views
-1

以下のコードは、ホルダーがinterfaceタイプとして指定されています。ホルダーオブジェクトへの参照によるパス値

Holderオブジェクトに変更を加えて参照型を受け取るようにすることができます。したがって、値オブジェクトが変更された場合はメインオブジェクトに反映されます。

type Holder struct { 
    Body interface{} 
} 

type Value struct { 
    Input int 
    Result int 
} 

func main() { 
    value := Value{Input: 5} 
    holder := Holder{Body: value} 

    fmt.Println(value) // {5 0} 
    modify(holder) 
    fmt.Println(value) // {5 0} should display {5 10} 
} 

func modify(holder Holder) { 
    var value Value = holder.Body.(Value) 
    value.Result = 2 * value.Input 
} 

Go Playground

+0

停止 "の参照"(ゴーで何も存在しない)、溶液が明らかになったことを考え。 – Volker

答えて

1
package main 

import "fmt" 

type Holder struct { 
    Body interface{} 
} 

type Value struct { 
    Input int 
    Result int 
} 

func main() { 
    value := Value{Input: 5} 
    holder := Holder{Body: &value} 

    fmt.Println(value) // {5 0} 
    modify(&holder) 
    fmt.Println(value) // {5 0} should display {5 10} 
} 

func modify(holder *Holder) { 
    var value *Value = holder.Body.(*Value) 
    value.Result = 2 * value.Input 
} 

https://play.golang.org/p/hG8cH4UBPc

+1

生のソースコードを超えた説明は、OPよりも広いオーディエンスにとって有益かもしれません。しかし、良い答え。 – Adrian