接口/结构“未实现X,错误的类型或方法,不确定为什么我会收到此错误

Hi guys fairly new to Golang, I understand that interfaces are kind of like contracts that guarantee that certain things will operate a certain way, thats cool and all, and if I make a local copy of it I can basically re-write how it operates (From what I understand, please correct me if I'm wrong)

Here is what I have so far

package register

import (
    "log"
    "net/http"


    "github.com/yohcop/openid-go"
)

var nonceStore = &openid.SimpleNonceStore{
    Store: make(map[string][]*openid.Nonce)}
var discoveryCache = &SimpleDiscoveryCache{}

type DiscoveredInfo interface {
    OpEndpoint() string
    OPLocalID() string
    ClaimedID() string
}

type SimpleDiscoveredInfo struct {
    opEndpoint, opLocalID, claimedID string
}

type SimpleDiscoveryCache map[string]DiscoveredInfo

func (s *SimpleDiscoveryCache) Put(id string, info DiscoveredInfo) {
    db := common.ConnectDB()

    rows, err := db.Query("INSERT INTO discovery_cache SET id=?, opendpoint=?, oplocalid=?, claimedid=?",
        id, info.OpEndpoint(), info.OPLocalID(), info.ClaimedID())

    if err != nil {
        panic("Error: " + err.Error())
    }

    log.Println(rows)
}

func (s *SimpleDiscoveryCache) Get(id string) DiscoveredInfo {
    db := common.ConnectDB()

    rows, err := db.Query("SELECT FROM discovery_cache WHERE id=?", id)
    if err != nil {
        panic("Error: " + err.Error())
    }

    log.Println(rows)

    var opEndpoint, opLocalID, claimedID string

    for rows.Next() {
        err := rows.Scan(&opEndpoint, &opLocalID, &claimedID)
        if err != nil {
            panic("Help!")
        }
    }

    return &SimpleDiscoveredInfo{
        opEndpoint, opLocalID, claimedID,
    }

}

func DiscoverHandler(w http.ResponseWriter, r *http.Request) {
    url, err := openid.RedirectURL("http://steamcommunity.com/openid", "http://localhost:1337/login/return", "http://localhost")

    if err != nil {
        http.Error(w, "Failed to login", 500)
    }

    http.Redirect(w, r, url, 303)
}

func CallbackHandler(w http.ResponseWriter, r *http.Request) {

    fullUrl := "http://localhost:1337" + r.URL.String()
    id, err := openid.Verify(fullUrl, discoveryCache, nonceStore)
    if err != nil {
        http.Error(w, "Failed", 500)
    }
    log.Println(id)

}

Basically I am trying to make my own DiscoveryCache so that it uses a database instead of memory for storage (as instructed to do by the Go-OpenID package located here: https://github.com/yohcop/openid-go

The part I'm trying to recreate is located here: https://github.com/yohcop/openid-go/blob/master/discovery_cache.go

Now I have done (what I assume) everything that should need doing to make this work, but I keep getting this error:

controllers/register/register.go:60: cannot use SimpleDiscoveredInfo literal (type *SimpleDiscoveredInfo) as type openid.DiscoveredInfo in return argument:
    *SimpleDiscoveredInfo does not implement openid.DiscoveredInfo (missing ClaimedID method)
controllers/register/register.go:78: cannot use discoveryCache (type *SimpleDiscoveryCache) as type openid.DiscoveryCache in argument to openid.Verify:
    *SimpleDiscoveryCache does not implement openid.DiscoveryCache (wrong type for Put method)
        have Put(string, DiscoveredInfo)
        want Put(string, openid.DiscoveredInfo)

If anybody could inform me on what I have done wrong that would be much appreciated. Thanks! If you need any more information please let me know.

SimpleDiscoveredInfo doesn't implement the interface's methods, you need something like this:

func (sdi *SimpleDiscoveredInfo) OpEndpoint() string { return sdi.opEndpoint }
func (sdi *SimpleDiscoveredInfo) OpLocalID() string  { return sdi.opLocalID }
func (sdi *SimpleDiscoveredInfo) ClaimedID() string  { return sdi.claimedID }

var _ openid.DiscoveredInfo = (*SimpleDiscoveredInfo)(nil)

http://play.golang.org/p/qVTTKfhNHu

For

controllers/register/register.go:78: cannot use discoveryCache (type *SimpleDiscoveryCache) as type openid.DiscoveryCache in argument to openid.Verify:
    *SimpleDiscoveryCache does not implement openid.DiscoveryCache (wrong type for Put method)
        have Put(string, DiscoveredInfo)
        want Put(string, openid.DiscoveredInfo)

Your types need to return openid.DiscoveredInfo not DiscoveredInfo.