2016-11-02 4 views
1

Я прочитал документ о создании пользовательских пакетов и т. Д., Но я не могу понять, в чем проблема.golang: Пользовательский пакет и 'undefined'

GOPATH=/Users/lrsmith/GoWorkSpace 
|->bin 
|->pkg 
|->src 
    |->github.com 
     |->lrsmith 
      |-> zaphod 
       |-> zaphod.go 

Я сделал «иди github.com/lrsmith/go-icinga2-api/iapi» и уронил его в ту же директорию, как «Зафод» и создал и .a файл под упак ,

GOPATH=/Users/lrsmith/GoWorkSpace 
|->bin/ 
|->pkg/ 
    |->..../iapi.a 
|->src/ 
    |->github.com/ 
     |->lrsmith/ 
      |-> zaphod/ 
       |-> zaphod.go 
      |-> go-icinga2-api/ 

zaphod.go очень просто прямо сейчас

package main 
import (
    "github.com/lrsmith/go-icinga2-api/iapi" 
) 
func main() { 
    t := iapi.Config("zaphod","beeblebrox","http://localhost",true) 
} 

Когда я иду построить в Зафод каталог я получаю ./zaphod.go:11 не определено: iapi.Config

Я прочитал документы, проверил случаи и попробовал разные структуры, но я не могу заставить его загрузить пакет и позвольте мне позвонить iapi.Config. Код iapi работает, и если я что-то создаю в каталоге go-icinga2-api, он отлично работает, и тест проходит все.

Я хочу создать отдельную базу проектов/кода, которая импортирует go-icinga2-api и использует ее, но не может показаться, что она работает.

Благодаря Len

Добавлена ​​информация. Структура идут-icinga2-АФИ

go-icinga2-api 
|-> iapi 
    |-> client.go 
    |-> client_test.go 
    |-> host.go 
     ....... 

client.go является

// Package iapi provides a client for interacting with an Icinga2  Server 
package iapi 

import (
    "bytes" 
    "crypto/tls" 
    "encoding/json" 
    "fmt" 
    "net/http" 
) 

// Server ... Use to be ClientConfig 
type Server struct { 
    Username   string 
    Password   string 
    BaseURL    string 
    AllowUnverifiedSSL bool 
    httpClient   *http.Client 
} 

// func Config ... 
func (server *Server) Config(username, password, url string, allowUnverifiedSSL bool) (*Server, error) { 

    // TODO : Add code to verify parameters 
    return &Server{username, password, url, allowUnverifiedSSL, nil}, nil 

} 

Я попытался с .go файлов до одного уровня, т.е. не вложен под iapi/к для того же Результаты.

ответ

2

Обновлено Ответ

В client.go, это выглядит, как вы пытаетесь использовать Config как конструктор для Server структур. Так как Config определяется приемником (func (server *Server)), это метод Server и не может быть вызван напрямую. Код должен работать, если вы удалите (server *Server).

Идиоматично назвать конструкторы New[type being returned], или New, если тип совпадает с именем пакета.

С 3-го абзаца Package Names section of Idiomatic Go:

функция для создания новых экземпляров ring.Ring-что определение конструктора в Go-обычно называться NewRing, но так как кольцо является только типа экспортируемой упаковки, а так как пакет называется кольцом, это называется просто новым, которые клиенты пакета рассматривают как ring.New

Оригинал ответ

Путь импорта должен ссылаться на каталог. В вашем коде вы ссылаетесь на этот пакет любым именем, которое используется в package [name] в файлах .go в этом каталоге.

Например, если github.com/lrsmith/go-icinga2-api содержит файл с именем api.go с линией package iapi, пакет импорта должен выглядеть следующим образом:

package main 
import (
    "github.com/lrsmith/go-icinga2-api" 
) 
func main() { 
    t := iapi.Config("zaphod","beeblebrox","http://localhost",true) 
} 
+0

I обновите вопрос. Файлы в go-icinga2-api живут по одному пути под файлом dir/iapi. –

+0

Большое спасибо, это была проблема. Я создал новую функцию New и назвал ее, и она работает так, как я ожидал. –

1

Обратите внимание на декларации о Config() функция:

func (server *Server) Config(username, password, url string, allowUnverifiedSSL bool) (*Server, error) 

Это «метод», который должен применяться к объекту Server:

server.Config(...) 

Таким образом, вы должны сначала создать объект сервера (или вы могли бы попробовать с нуля):

var server iapi.Server 
server, err := server.Config(...) 

Вы пытаетесь запустить его, как если бы это было следующее заявление:

func Config(username, password, url string, allowUnverifiedSSL bool) (*Server, error) 
+0

я изменил zaphod.go объявить переменную первый, но я получаю ту же ошибку '' 'пакетов главного импорта ( «github.com/lrsmith/go-icinga2-api/iapi» ) FUNC основной() { var server iapi.Server server, _ = iapi.Config ("zaphod", "beeblebrox", "http: // localhost", true) } '' '' '' $ go build # github.com/ lrsmith/zaphod ./zaphod.go:7: undefined: iapi.Config''' –

+0

Я не уверен, почему объявление его сначала не сработало. вместо этого настроить конфигурацию, чтобы не быть методом структуры, казалось, выполняли эту работу. Но я бы ожидал, что объявит об этом, после чего метод будет работать. –

Смежные вопросы