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)