如何修改对象的值副本而不更改golang中的原始值?

时间:2020-09-11 17:12:10

标签: go types interface

在更改对象的值时遇到一些问题。我也是新来的守门员。请考虑以下示例。

//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。如何实现此目的?

https://play.golang.org/p/4EXHab6kIeZ

1 个答案:

答案 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)

}

https://goplay.space/#H9MD7pZMmVw