【问题标题】:How to append custom attribute to Golang struct like $append on a Laravel model?如何将自定义属性附加到 Golang 结构,如 Laravel 模型上的 $append?
【发布时间】:2022-02-23 13:33:30
【问题描述】:

我正在尝试向我的 Golang 结构添加自定义属性,就像我通常使用 $appends 变量在 Laravel 模型上添加自定义属性一样。
这是代码:

package models

import (
    "time"
)

type Dummy struct {
    ID          string `json:"id" gorm:"primary_key"`
    Description string `json:"description"`
    Image       string `json:"image"`
    ImageUrl    ImageUrlDummy
    Number      int       `json:"number"`
    UserId      string    `json:"user_id"`
    User        User      `json:"user"`
    CreatedAt   time.Time `json:"created_at"`
    UpdatedAt   time.Time `json:"updated_at"`
}

func ImageUrlDummy() string {
    return "test"
}


但是,结构内的 ImageUrlDummy 不起作用,它返回错误,例如:

ImageUrlDummy (value of type func() string) is not a type


如何从 Laravel 到 Golang 实现相同的代码?
class Dummy extends Model
{
    protected $appends = ['image_url'];

    public function getImageUrlAttribute(){
        return "this is the image url";
    }
}

请原谅我还在学习 Golang,谢谢

【问题讨论】:

    标签: go struct


    【解决方案1】:

    离你不远了..

    将结构更改为(删除 ImageUrlDummy,修复 Image 的 json 标签):

        type Dummy struct {
            ID          string `json:"id" gorm:"primary_key"`
            Description string `json:"description"`
            Image       string `json:"image"`
            Number      int       `json:"number"`
            UserId      string    `json:"user_id"`
            User        User      `json:"user"`
            CreatedAt   time.Time `json:"created_at"`
            UpdatedAt   time.Time `json:"updated_at"`
        }
    

    然后用 Dummy 指针类型的接收器定义一个方法

        func (d *Dummy) ImageUrl() string {
            return "test"
        }
    

    还有一些例子:https://play.golang.com/p/olGSFhBgqkG

    【讨论】:

    • 谢谢,这几乎是我需要的,但是当我调用 Dummy 结构时如何自动添加 ImageUrl 属性?这是示例 play.golang.com/p/RrjQ4Z5-UrR ,我希望它至少从空的初始化结构返回“测试”
    • play.golang.com/p/zHwWdS3dFiI 因为您有 JSON 标签,使用 json.Unmarshal 也会为您设置结构中的值,而不必自己实例化它们。您不能“调用”结构,结构是一种类型,并且可以在结构上定义方法。在您的使用中,您可能会将一些 JSON 解组到该结构中,然后使用方法来操作结构中的字段、getter/setter 等。不过,您不必使用 getter/setter 方法,具体取决于范围。
    • @radren 您是否尝试为 ImageUrl 设置默认值,以便每个实例都具有默认值,除非它被数据库中的值覆盖? Go 不会像在 PHP 中那样使用默认值。我认为构造函数 NewDummy() 是一个很好的方法。在返回新结构之前,您可以检查是否为空并设置默认值。其他选项:stackoverflow.com/questions/37135193/…
    • @BrianWagner 是的,我正在尝试这样做,但我认为我做不到,所以我决定改用 setter 和 getter,也感谢您的链接,我会查一下
    猜你喜欢
    • 2016-06-12
    • 2017-02-20
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    相关资源
    最近更新 更多