golang:定制包装和';未定义';
我读过关于创建自定义软件包等的文档,但我似乎无法确定问题出在哪里golang:定制包装和';未定义';,go,Go,我读过关于创建自定义软件包等的文档,但我似乎无法确定问题出在哪里 GOPATH=/Users/lrsmith/GoWorkSpace |->bin |->pkg |->src |->github.com |->lrsmith |-> zaphod |-> zaphod.go 我做了一个“go-get-github.com/lrsmith/go-icinga2-api/iapi”和它
GOPATH=/Users/lrsmith/GoWorkSpace
|->bin
|->pkg
|->src
|->github.com
|->lrsmith
|-> zaphod
|-> zaphod.go
我做了一个“go-get-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目录中进行go构建时,我得到
./zaphod.go:11:undefined:iapi.Config
我已经阅读了文档,检查了案例并尝试了不同的结构,但我似乎无法让它加载包并让我调用iapi.Config。iapi代码可以工作,如果我在go-icinga2-api目录中构建了一些东西,那么它可以正常工作,测试也可以通过
我想创建一个单独的项目/代码库,导入go-icinga2-api并使用它,但似乎无法让它工作
谢谢
莱恩
添加信息。go-icinga2-api的结构为
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/to下面,以获得相同的结果。更新的答案 在
client.go
中,您似乎试图使用Config
作为Server
结构的构造函数。由于Config
是用接收方(func(server*server)
)定义的,因此它是server
的一种方法,不能直接调用。如果您删除(服务器*服务器)
,您的代码应该可以工作
将构造函数命名为New[返回的类型]
,或New
(如果类型与包同名)
从《公约》第3段:
生成ring.ring的新实例的函数——这是Go中构造函数的定义——通常称为NewRing,但由于ring是包导出的唯一类型,并且包名为ring,因此称为new,包的客户端将其视为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)
}
注意Config()函数的声明:
func (server *Server) Config(username, password, url string, allowUnverifiedSSL bool) (*Server, error)
这是一种应用于服务器对象的“方法”:
server.Config(...)
因此,您需要首先创建一个服务器对象(或者可以尝试使用nil):
您正在尝试运行它,就像它具有以下声明一样:
func Config(username, password, url string, allowUnverifiedSSL bool) (*Server, error)
我修改了zaphod.go以首先声明变量,但是我得到了相同的错误
包主导入(“github.com/lrsmith/go-icinga2-api/iapi”)func main(){var server iapi.server,wu=iapi.Config(“zaphod”,“beeblebrox”,”http://localhost“,对)}
$go build#github.com/lrsmith/zaphod./zaphod.go:7:undefined:iapi.Config
我不确定为什么首先声明它不起作用。相反,将配置调整为不作为似乎要执行此工作的结构的方法。但是我本来希望声明它,然后调用该方法来工作。我更新了这个问题。go-icinga2-api中的文件确实位于dir/iapit下面的一条路径上,这就是问题所在。我创建了一个新函数new并调用了它,它按照我的预期工作。
var server iapi.Server
server, err := server.Config(...)
func Config(username, password, url string, allowUnverifiedSSL bool) (*Server, error)