2017-03-09 51 views
-1

以下代码拥有指定为interface类型的持有者。通过引用持有者对象传递值

Holder对象可以做什么修改,因此它可以接收任何类型的引用类型,所以如果对value对象进行任何修改,它会反映到main对象上。

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

停止思考 “引用”(有没有在Go),溶液变得很明显。 – 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