Go中接收器的方法声明

时间:2013-12-20 11:10:35

标签: 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)
    }
}

如果我有界面,如何注册方法?

2 个答案:

答案 0 :(得分:2)

您正尝试将新方法添加到另一个包中的预先存在的结构中;你不能这样做。

正确的方法是在您自己的包中定义一个结构,该结构将为预先存在的结构添加别名并继承其所有方法。完成后,您将能够将新方法添加到新结构中。

之后,您可以在任何地方使用自己的结构,这样您就可以访问额外的方法。

答案 1 :(得分:0)

现在可能很想看看你是否可以将方法和行为附加到任何类型,例如int或time.Time - 不可能。只有在同一个包中定义了类型时,才能为类型添加方法。

来自GoLang Tutorials - Methods on structs