go - 使用接口(interface)设置具体结构的值

标签 go

我正在尝试在具体结构中设置属性的值,使用该结构使用和接口(interface)实现的方法。该结构还由另一个结构组成。

在下面的示例中,userId 值仍然是“aaaa”并且不会更新为“userid1”。

如何通过方法接口(interface)作为参数并通过结构体作为参数来更新结构体的值?

func main() {

    user:=User{}

    mw:=SomeMiddleware{}
    user.UserId="aaaa"
    mw.Process(user)

    fmt.Println("UserId: " + user.UserId)
}

type IUser interface {
   SetUserId(string)
}

type SomeMiddleware struct {
}

func(m SomeMiddleware) Process(user IUser){
    user.SetUserId("userid1")
}


type User struct {
    UserInfo
}

type UserInfo struct {
    UserId string
}

func(ui UserInfo) SetUserId(userId string) {
    ui.UserId=userId
}

最佳答案

你可以像这样使用指针,

package main

import (
    "fmt"
)

func main() {

    user := User{}

    mw := SomeMiddleware{}
    user.UserId = "aaaa"
    mw.Process(&user) // Send reference to user here (&user)

    fmt.Println("UserId: " + user.UserId)
}

type IUser interface {
    SetUserId(string)
}

type SomeMiddleware struct {
}

func (m *SomeMiddleware) Process(user IUser) { // Pointer receiver (m *SomeMiddleware)
    user.SetUserId("userid1")
}

type User struct {
    UserInfo
}

type UserInfo struct {
    UserId string
}

func (ui *UserInfo) SetUserId(userId string) {  // Pointer receiver (ui *UserInfo)
    ui.UserId = userId
}

关于go - 使用接口(interface)设置具体结构的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55545566/

相关文章:

google-app-engine - 云发布/订阅 : Pull subscriber with GAE/Go Standard

bash - 执行exec.Command似乎无法将信息通过管道传输或附加到.txt文件。我的语法错误吗?

go - 如何在 go.mod 中最好地声明 golang 依赖版本?

go - 去模板变量检查不符合我的预期

go - (启动容器: API error (500) Hyperledger时出错

go - 为什么 Go 的 bufio 在后台使用 panic?

macos - go: http 服务器在 osx 上不工作

go - 为空自定义类型省略 JSON

file - Go (golang) 由几个文件夹组成的包

windows - 命令提示符下的 Go 语言的 godoc