首页 > 解决方案 > 在结构上重用方法

问题描述

我有一个方法,它将一个 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)

另一个结构将具有不同的字段,但对于此方法而言,这同样无关紧要。是否可以重用此方法还是需要将其转换为函数?

标签: go

解决方案


使用此实用功能。它适用于指向任何类型的指针。

// 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())
    }
}

推荐阅读