Go 中带有接收器的方法声明

以下错误:


./main.go:13: c.Set undefined (type redis.Conn has no field or method Set)

./main.go:19: invalid receiver type *redis.Conn (redis.Conn is an interface type)

./main.go:20: red.Send undefined (type *redis.Conn has no field or method Send)

是从这个代码产生的:


package main


import (

    "encoding/json"

    "github.com/garyburd/redigo/redis"

    "github.com/gorilla/mux"

    "log"

    "net/http"

    )


func setHandler(res http.ResponseWriter, req *http.Request) {

    c := connectRedis()

    c.Set("foo", "bar")

    data, _ := json.Marshal("{'order':1, 'weight': 100, 'reps': 5, 'rest': 1}")

    res.Header().Set("Content-Type", "application/json; charset=utf-8")

    res.Write(data)

}


func (red *redis.Conn) Set(key string, value string) error {

    if _, err := red.Send("set", key, value); err != nil {

        return err

    }

}


func connectRedis() redis.Conn {

    c, err := redis.Dial("tcp", ":6379")

    if err != nil {

            // handle error

    }

    defer c.Close()

    return c

}


func main() {

    r := mux.NewRouter()

    r.HandleFunc("/sets.json", setHandler)

    http.Handle("/", r)

    err := http.ListenAndServe(":7000", nil)

    if err != nil {

        log.Fatal("ListenAndServe: ", err)

    }

}

当我有一个接口时,如何注册一个方法?


冉冉说
浏览 332回答 2
2回答

慕的地6264312

您正在尝试从另一个包中向预先存在的结构添加新方法;你不能这样做。正确的做法是在您自己的包中定义一个结构,该结构将为预先存在的结构设置别名并继承其所有方法。这样做之后,您将能够将新方法添加到新结构中。之后,您可以在任何地方使用您自己的结构,以便您可以访问额外的方法。

aluckdog

您现在可能想看看是否可以将方法和行为附加到任何类型,例如 int 或 time.Time - 不可能。只有在同一包中定义了类型时,您才能为该类型添加方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go