go - 在结构上重用方法
问题描述
我有一个方法,它将一个 URL 带到一个 yaml 文件并将其解组为一个结构。它没有什么独特之处,所以我想在另一个结构上使用它。
type SWConfig struct {
Name string `yaml:"name"`
Version string `yaml:"version"`
BuildType string `yaml:"buildType"`
}
func (c *SWConfig) getConfiguration(url string) {
resp, err := http.Get(url)
if err != nil {
log.Fatalf("ERROR: GET request failed: %s\n", err.Error())
}
if resp.StatusCode != http.StatusOK {
log.Fatalf("ERROR: %v: %s\n", resp.Status, url)
}
source, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatalf("ERROR: could not read response: %s\n", err.Error())
}
err = yaml.Unmarshal(source, c)
if err != nil {
log.Fatalf("ERROR: could not read YAML: %s\n", err.Error())
}
}
var swConfig SWConfig
swConfig.getConfiguration(swURL)
fmt.Println(swConfig.Name)
另一个结构将具有不同的字段,但对于此方法而言,这同样无关紧要。是否可以重用此方法还是需要将其转换为函数?
解决方案
使用此实用功能。它适用于指向任何类型的指针。
// fetchYAML unmarshals the YAML document at url to the value
// pointed to by v.
func fetchYAML(url string, v interface{}) error {
resp, err := http.Get(url)
if err != nil {
return err
}
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("bad status: %v: %s\n", resp.Status, url)
}
source, err := ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
err = yaml.Unmarshal(source, v)
return err
}
像这样称呼它:
func (c *SWConfig) getConfiguration(url string) {
if err := fetchYAML(url, c); err != nil {
log.Fatalf("ERROR: get value failed: %s\n", err.Error())
}
}
推荐阅读
- machine-learning - 如何结合二元分类和回归问题
- javascript - 如何获取从 ec2 上传的文件的 url
- django - Django/DRF 过滤
- android - 颤振:添加 firebase_admob 后构建失败
- javascript - 是否可以通过单击任何按钮来更改 DOM 加载的 javascript 代码而无需加载页面?
- c# - Entity Framework 代码先将 FK 加倍为 PK
- mql4 - 无法使用功能正常的 Pine-Script 示例在 MQL4 中计算正确的交易量 RSI
- php - WordPress 活动日程无法正常工作
- python - 我收到这种类型的错误:TypeError:'int'和'str'的实例之间不支持'<'
- python - tf.sets.intersection 的错误:ValueError:形状必须至少为 2 级,但对于“DenseToDenseSetOperation_12”为 1 级