Go语言 我可以删除这段代码中的冗余吗?

wgx48brx  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(78)

我有这个行动密码

type Collections struct {
    Object string `json:"object"`
    Data   []struct {
        Object     string      `json:"object"`
        ID         string      `json:"id"`
        Groups     interface{} `json:"groups"`
        ExternalID interface{} `json:"externalId"`
    } `json:"data"`
}
type Members struct {
    Object string `json:"object"`
    Data   []struct {
        Object                string      `json:"object"`
        ID                    string      `json:"id"`
        UserID                string      `json:"userId"`
        Name                  string      `json:"name"`
        Email                 string      `json:"email"`
    } `json:"data"`
}
type Groups struct {
    Object string `json:"object"`
    Data   []struct {
        Object      string `json:"object"`
        ID          string `json:"id"`
        Name       string `json:"name"`
        AccessAll  bool   `json:"accessAll"`
        ExternalID string `json:"externalId"`
    } `json:"data"`
}

func bwRequestWithBT(uri string) []byte {

    url := endpoint + uri
    // Create a new request using http
    req, err := http.NewRequest("GET", url, nil)
    // Send req using http Client
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        log.Err(err)
    }
    defer resp.Body.Close()
    body, _ := io.ReadAll(resp.Body)

    return body
}

func (c *Collections) APIData() {
    err := json.Unmarshal(RequestWithBT("/collections"), &c)
    if err != nil {
        log.Error().Err(err).Msg("Error while unmarshalling collection")
    }
}

func (m *Members) APIData() {
    err := json.Unmarshal(RequestWithBT("/members"), &m)
    if err != nil {
        log.Error().Err(err).Msg("Error while unmarshalling members")
    }
}

func (g *Groups) APIData() {
    err := json.Unmarshal(RequestWithBT("/groups"), &g)
    if err != nil {
        log.Error().Err(err).Msg("Error while unmarshalling groups")
    }
}

var members Members
members.APIData()

var groups Groups
groups.APIData()

var collection Collections
collection.APIData()

在进行API调用时,您会得到不同的JSON响应。
我觉得我重新定义APIData三次是在重复自己。
在Golang有办法做这样的事情吗?

func (object GenericObject) APIData(uri string){
    err := json.Unmarshal(RequestWithBT(uri), &object)
    if err != nil {
        log.Error().Err(err).Msg("Error while unmarshalling")
    }
}

var members Members
var groups Groups
var collection Collections

members.APIData("/members")
groups.APIData("/groups")
collection.APIData("/collections")

或者这首曲子?

wbrvyc0a

wbrvyc0a1#

我们可以很容易地回答这个问题,如果我们了解,如何以及何时使用它在未来。
让我们假设您只是尝试对发出请求并解析响应的方法进行DRY。
然后考虑有一个“请求者”方法和支持的接口:

type Entity interface {
    URI() string
}

func load(entity Entity) error {
    err := json.Unmarshal(RequestWithBT(entity.URI()), &entity)
    if err != nil {
        log.Error().Err(err).Msg("Error while unmarshalling members")
    }
}

我们可以这样使用它:

var members Members
var groups Groups
var collection Collections

load(&members)
load(&groups)
load(&collection)

当然,我们应该在每个实体上定义一个URL()方法。
在这种情况下,我没有看到使用泛型的好选择,但你可以在那里搜索一些见解:https://go.dev/doc/tutorial/generics

相关问题