在结构上重用方法

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

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


蓝山帝景
浏览 169回答 1
1回答

月关宝盒

使用此实用功能。它适用于指向任何类型的指针。// 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())    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go