2013-12-20 76 views
0

接收到以下错误:方法声明与围棋

./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

“做这将是定义你自己的包结构将别名预先存在的结构,并继承其所有的方法正确的方法。” 但是,根据错误消息,redis.Conn是一个接口类型,而不是一个结构。所以我不确定这会有效。我认为你需要一个具有redis.Conn作为成员的结构。 – MatrixFrog

+0

答案和评论是完美的。谢谢。 –

0

现在您可能会试探一下,看看您是否可以将方法和行为附加到任何类型,比如int或time.Time - 不可能。只有在类型在同一个包中定义的情况下,才能够为类型添加方法。

GoLang Tutorials - Methods on structs