我已经阅读了有关创建自定义软件包等的文档,但我似乎无法确定问题所在。
GOPATH=/Users/lrsmith/GoWorkSpace
|->bin
|->pkg
|->src
|->github.com
|->lrsmith
|-> zaphod
|-> zaphod.go
我已经完成了“去github.com/lrsmith/go-icinga2-api/iapi'而且它 把它放到同一个目录中,然后再按照zaphod'并在pkg下创建了.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目录中进行构建时,我得到了 ./zaphod.go:11:undefined:iapi.Config
我已经阅读了文档,检查了案例并尝试了不同的结构,但我似乎无法加载程序包并让我调用iapi.Config。 iapi代码有效,如果我在go-icinga2-api目录中构建一些东西,它工作正常,测试全部通过。
我想创建一个单独的项目/代码库来导入go-icinga2-api并使用它,但似乎无法让它工作。
由于 莱恩
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 /下面以获得相同的结果。
答案 0 :(得分:2)
更新了答案
在client.go
中,您似乎正在尝试使用Config
作为Server
结构的构造函数。由于Config
是使用接收器(func (server *Server)
)定义的,因此它是Server
的方法,无法直接调用。如果您删除(server *Server)
,则代码应该有效。
如果类型与包名称相同,则命名构造函数New[type being returned]
或New
是惯用的。
来自Package Names section of Idiomatic Go的第3段:
创建ring的新实例的函数.Ring-这是Go中构造函数的定义 - 通常称为NewRing,但由于Ring是包导出的唯一类型,并且由于包被称为ring,它被称为新的,包的客户端看起来像ring.New
原始答案
导入路径应引用目录。在您的代码中,您可以通过该目录中.go文件中package [name]
中使用的任何名称来引用该包。
例如,如果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)
}
答案 1 :(得分:1)
注意Config()函数的声明:
func (server *Server) Config(username, password, url string, allowUnverifiedSSL bool) (*Server, error)
这是一个应该应用于Server对象的“方法”:
server.Config(...)
因此,您需要先创建一个Server对象(或者您可以尝试使用nil):
var server iapi.Server
server, err := server.Config(...)
您尝试运行它,就好像它有以下声明:
func Config(username, password, url string, allowUnverifiedSSL bool) (*Server, error)