我有这个行动密码
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")
或者这首曲子?
1条答案
按热度按时间wbrvyc0a1#
我们可以很容易地回答这个问题,如果我们了解,如何以及何时使用它在未来。
让我们假设您只是尝试对发出请求并解析响应的方法进行DRY。
然后考虑有一个“请求者”方法和支持的接口:
我们可以这样使用它:
当然,我们应该在每个实体上定义一个
URL()
方法。在这种情况下,我没有看到使用泛型的好选择,但你可以在那里搜索一些见解:https://go.dev/doc/tutorial/generics