douza1373 2017-12-25 00:11
浏览 110
已采纳

在Golang中转换组合类型

I've been reading about type alias and composed structs in Golang. I want to be able to have two structs which are structurally identical but can be easily converted between each other.

I have a parent structure defined as:

type User struct {
    Email    string `json:"email"`
    Password string `json:"password"`
}

And a composed struct defined as:

type PublicUser struct {
    *User
}

I would expect that if I define a User:

a := User{
        Email:    "admin@example.net",
        Password: "1234",
    }

I could then perform the following type conversion:

b := (a).(PublicUser)

But it fails with an invalid type assertion:

invalid type assertion: a.(PublicUser) (non-interface type User on left)

How can I convert between structurally similar types in Go?

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

  • 写回答

1条回答 默认 最新

  • dongtu0363 2017-12-25 00:47
    关注

    Type assertions in Go let you tap into an interface's concrete type, not into structs:

    A type assertion provides access to an interface value's underlying concrete value.
    https://tour.golang.org/methods/15

    However, with slight modifications, this code works and probably behaves as you would expect:

    package main
    
    import (
        "fmt"
    )
    
    type User struct {
        Email    string `json:"email"`
        Password string `json:"password"`
    }
    
    type PublicUser User
    
    func main() {
        a := User{
            Email:    "admin@example.net",
            Password: "1234",
        }
        fmt.Printf("%#v
    ", a)
        // out: User{Email:"admin@example.net", Password:"1234"}
    
        b := PublicUser(a)
        fmt.Printf("%#v", b)
        // out PublicUser{Email:"admin@example.net", Password:"1234"}
    }
    

    Here, PublicUser is a redefinition of the User type; most importantly, it is a standalone type, shares the fields, but not the method set of User (https://golang.org/ref/spec#Type_definitions).

    Then, you can simply use the PublicUser type constructor, as you might have been doing similarly with string/[]byte conversions: foo := []byte("foobar").

    If, on the other hand, you were to use an actual type alias (type PublicUser = User) your output will list User as type for both instances: PublicUser is only a new name for the old thing, not a new type.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥30 Matlab打开默认名称带有/的光谱数据
  • ¥50 easyExcel模板 动态单元格合并列
  • ¥15 res.rows如何取值使用
  • ¥15 在odoo17开发环境中,怎么实现库存管理系统,或独立模块设计与AGV小车对接?开发方面应如何设计和开发?请详细解释MES或WMS在与AGV小车对接时需完成的设计和开发
  • ¥15 CSP算法实现EEG特征提取,哪一步错了?
  • ¥15 游戏盾如何溯源服务器真实ip?需要30个字。后面的字是凑数的
  • ¥15 vue3前端取消收藏的不会引用collectId
  • ¥15 delphi7 HMAC_SHA256方式加密
  • ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
  • ¥15 下列c语言代码为何输出了多余的空格