在更改对象的值时遇到一些问题。我也是新来的守门员。请考虑以下示例。
//interface
type A interface{
GetVal() interface{}
}
//type which implements interface A
type B struct{
Val interface{}
}
func (j *B)GetVal() interface{}{
return j.Val
}
//function where object of B is getting created
func exmaple1(){
obj := &B{Val:"25"}
Example2(obj)
}
func Example2(handler A){
val := handler.GetVal()
example3(val1)
}
func example3(val1 interface{}){
// do some modifiaction on val1
}
我的问题是,如果我只想将val1(在example3内)修改为不同的值,例如10,并且不应该更改原始值处理程序.GetVal(),这里的example 25.我该怎么做??。我该如何创建handler.GetVal()的副本并传递给函数example3,以便仅更改其副本而不是原始副本。
我将值传递为map [sting] interface {},而不是将对象值作为字符串传递,如下面的示例所示,并在exmaple3中对其进行了修改以添加新的键。
软件包主要
import (
"fmt"
)
type A interface{
GetVal() interface{}
}
//type which implements interface A
type B struct{
Val interface{}
}
func (j *B)GetVal() interface{}{
return j.Val
}
func Example2(handler A){
val := handler.GetVal()
example3(val)
}
func example3(val1 interface{}){
// do some modifiaction on val1
val1.(map[string]interface{})["password"] = "heloo"
}
func main(){
obj := &B{Val:map[string]interface{}{"userName": "noob"}}
Example2(obj)
fmt.Println(obj)
}
在这里,如果我在Example3中修改val1(例如:添加一个新键),则obj也将通过添加新键而被更改。如何避免呢?是什么原因呢?我不想更改原始的obj.On只应更改其副本。如何创建obj副本并将其传递给example3,以便仅修改其副本而不修改原始obj。如何实现此目的?
答案 0 :(得分:0)
正如@Muffin指出的那样,example3
不会修改val1
。如果确实要修改值,则需要使用pointer receivers
package main
import (
"fmt"
)
//interface
type A interface {
GetVal() interface{}
SetVal(val interface{})
}
//type which implements interface A
type B struct {
Val interface{}
}
func (j *B) GetVal() interface{} {
return j.Val
}
func (j *B) SetVal(v interface{}) {
j.Val = v
}
func Example(handler A) {
val := handler.GetVal()
inner(val)
}
func inner(val1 interface{}) {
// do some modifiaction on val1
val1 = 100
}
func SetExample(handler A, v interface{}) {
handler.SetVal(v)
}
func main() {
obj := &B{Val: "25"}
Example(obj)
fmt.Println(obj)
SetExample(obj, 100)
fmt.Println(obj)
}