2015-01-03 4 views
-1

У меня есть следующие фрагменты кода:Go компиляции ошибка «неопределенная функция»

Интерфейс определения & функции:

package helper 

import "gopkg.in/mgo.v2/bson" 

// Defines an interface for identifiable objects 
type Identifiable interface { 
    GetIdentifier() bson.ObjectId 
} 

// Checks if a slice contains a given object with a given bson.ObjectId 
func IsInSlice(id bson.ObjectId, objects []Identifiable) bool { 
    for _, single := range objects { 
     if single.GetIdentifier() == id { 
      return true 
     } 
    } 
    return false 
} 

определение пользовательского структуры, которая удовлетворяет «Опознаваемая»:

package models 

import (
    "github.com/my/project/services" 
    "gopkg.in/mgo.v2/bson" 
) 

type User struct { 
    Id  bson.ObjectId `json:"_id,omitempty" bson:"_id,omitempty"` 
    Username string   `json:"username" bson:"username"` 
    Email string   `json:"email" bson:"email"` 
    Password string   `json:"password" bson:"password"` 
    Albums []bson.ObjectId `json:"albums,omitempty" bson:"albums,omitempty"` 
    Friends []bson.ObjectId `json:"friends,omitempty" bson:"friends,omitempty"` 
} 

func GetUserById(id string) (err error, user *User) { 
    dbConnection, dbCollection := services.GetDbConnection("users") 
    defer dbConnection.Close() 
    err = dbCollection.Find(bson.M{"_id": bson.ObjectIdHex(id)}).One(&user) 
    return err, user 
} 

func (u *User) GetIdentifier() bson.ObjectId { 
    return u.Id 
} 

Испытание whi кан проверяет существование объекта внутри кусочка:

package controllers 

import ( 
    "github.com/my/project/helper" 
    "gopkg.in/mgo.v2/bson" 
) 


var testerId = bson.NewObjectId() 
var users = []models.Users{} 

/* Some code to get users from db */ 

if !helper.IsInSlice(testerId, users) { 
    t.Fatalf("User is not saved in the database") 
} 

Когда я пытаюсь скомпилировать тест это я получаю сообщение об ошибке: undefined helper.IsInSlice. Когда я переписываю метод IsInSlice, чтобы не принимать []Identifiable, но []models.User он отлично работает.

Любые идеи?

+0

Я думаю, что срез интерфейсов не может соответствовать фрагменту других типов, даже если тип соответствует интерфейсу. Взгляните на этот длинный пост: https://groups.google.com/forum/#!topic/golang-nuts/Il-tO1xtAyE – siritinga

ответ

0

Видимо, Go не перестраивал мой пакет и искал функцию в старой сборке. Поэтому он не был определен. Выполнение rm -fr [GO-ROOT]/pkg/github.com/my/project/models сделал трюк.

0

Ваша проблема в том, что вы пытаетесь использовать значение типа []models.Users{} как значение типа []Identifiable. В то время как models.Users реализует Identifiable, система типа Go спроектирована так, что срезы значений, реализующих интерфейс, не могут использоваться как (или преобразованные в) срезы типа интерфейса.

Дополнительную информацию см. В спецификации section on conversions спецификации Go.

+0

Хорошо - это была бы еще одна проблема. Но компилятор говорит мне, что функция не определена - это просто неверно? – Michel

+0

Вам нужно разделить больше кода - а именно, какой тип «помощник»? – joshlf

+0

helper - это пакет, содержащий функцию IsInSlice. – Michel