golang:自定义包和' undefined'

时间:2016-11-02 03:44:22

标签: go

我已经阅读了有关创建自定义软件包等的文档,但我似乎无法确定问题所在。

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的结构是

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 个答案:

答案 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)