英文:
golang : Custom package and 'undefined'
问题
我已经阅读了关于创建自定义包的文档,但似乎无法确定问题出在哪里。
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 build 时,我得到以下错误
./zaphod.go:11: undefined: iapi.Config
我已经阅读了文档,检查了大小写,并尝试了不同的结构,但似乎无法加载该包并让我调用 iapi.Config。iapi 代码是有效的,如果我在 go-icinga2-api 目录中构建某些东西,它可以正常工作并通过所有测试。
我想创建一个独立的项目/代码库,导入 go-icinga2-api 并使用它,但似乎无法使其工作。
谢谢
Len
#添加的信息。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/ 下,但结果相同。
英文:
I've read the doc on creating custom packages, etc but I can't seem to pin down what the problem is.
GOPATH=/Users/lrsmith/GoWorkSpace
|->bin
|->pkg
|->src
|->github.com
|->lrsmith
|-> zaphod
|-> zaphod.go
I've done a 'go get github.com/lrsmith/go-icinga2-api/iapi' and it
dropped it into the same dir as 'zaphod' and created and .a file under pkg.
GOPATH=/Users/lrsmith/GoWorkSpace
|->bin/
|->pkg/
|->..../iapi.a
|->src/
|->github.com/
|->lrsmith/
|-> zaphod/
|-> zaphod.go
|-> go-icinga2-api/
zaphod.go is very simple right now
package main
import (
"github.com/lrsmith/go-icinga2-api/iapi"
)
func main () {
t := iapi.Config("zaphod","beeblebrox","http://localhost",true)
}
When I do a go build in the zaphod directory I get
./zaphod.go:11: undefined: iapi.Config
I've read through the docs, checked cases and tried different structures but I can't seem to get it to load the package and let me call iapi.Config. The iapi code works and if I build something in the go-icinga2-api directory it works fine and the test all pass.
I want to create a separate project/code base that imports the go-icinga2-api and uses it, but can't seem to get it work.
Thanks
Len
Added info. The structure for go-icinga2-api is
go-icinga2-api
|-> iapi
|-> client.go
|-> client_test.go
|-> host.go
.......
client.go is
// 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
}
I've tried with the .go files up one level, i.e. not nested underneath iapi/ to for the same results.
答案1
得分: 2
更新的答案
在client.go
中,看起来你试图将Config
作为Server
结构体的构造函数使用。由于Config
是使用接收器(func(server *Server)
)定义的,它是Server
的方法,不能直接调用。如果你删除(server *Server)
,你的代码应该可以工作。
按照惯例,构造函数的命名应为New[返回的类型]
,或者如果类型与包的名称相同,则为New
。
来自《Go 语言的惯用法》中的《包名称》一节的第三段:
> 用于创建 ring.Ring 的新实例的函数——这是 Go 中构造函数的定义——通常被称为 NewRing,但由于 Ring 是包导出的唯一类型,并且由于该包的名称为 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)
}
英文:
Updated Answer
In client.go
, it looks like you're trying to use Config
as a constructor for Server
structs. Since Config
is defined with a receiver (func (server *Server)
), it's a method of Server
and can't be called directly. You're code should work if you remove (server *Server)
.
It's idiomatic to name constructors New[type being returned]
, or New
if the type is the same name as the package.
From the 3rd paragraph of the Package Names section of Idiomatic Go:
> the function to make new instances of ring.Ring—which is the definition of a constructor in Go—would normally be called NewRing, but since Ring is the only type exported by the package, and since the package is called ring, it's called just New, which clients of the package see as ring.New
Original Answer
The import path should reference a directory. In your code, you then reference that package by whatever name is used in the package [name]
in the .go files in that directory.
For example, if github.com/lrsmith/go-icinga2-api
contains a file called api.go
with the line package iapi
, your importing package should look like this:
package main
import (
"github.com/lrsmith/go-icinga2-api"
)
func main () {
t := iapi.Config("zaphod","beeblebrox","http://localhost",true)
}
答案2
得分: 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)
英文:
Note the declaration of the Config() function:
func (server *Server) Config(username, password, url string, allowUnverifiedSSL bool) (*Server, error)
It's a "method" that should be applied to a Server object:
server.Config(...)
Thus you need to first create a Server object (or you could try with nil):
var server iapi.Server
server, err := server.Config(...)
You're trying to run it as if it had the following declaration:
func Config(username, password, url string, allowUnverifiedSSL bool) (*Server, error)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论