2016-11-02 4 views
1

私はカスタムパッケージの作成などに関するドキュメントを読んだことがありますが、問題の原因を突き止めることはできません。golang:カスタムパッケージと '未定義'

GOPATH=/Users/lrsmith/GoWorkSpace 
|->bin 
|->pkg 
|->src 
    |->github.com 
     |->lrsmith 
      |-> zaphod 
       |-> zaphod.go 

私は「zaphod」と作成した「github.com/lrsmith/go-icinga2-api/iapi取りに行く」とそれ が同じディレクトリにそれを落とし、PKGの下では.aファイルをやりました。

GOPATH=/Users/lrsmith/GoWorkSpace 
|->bin/ 
|->pkg/ 
    |->..../iapi.a 
|->src/ 
    |->github.com/ 
     |->lrsmith/ 
      |-> zaphod/ 
       |-> zaphod.go 
      |-> go-icinga2-api/ 

私は ./zaphod.go:11を取得zaphodディレクトリに構築行くときzaphod.goは今

package main 
import (
    "github.com/lrsmith/go-icinga2-api/iapi" 
) 
func main() { 
    t := iapi.Config("zaphod","beeblebrox","http://localhost",true) 
} 

非常に簡単です:未定義:iapi.Config

私はドキュメント、チェックされたケースを読んで、さまざまな構造を試しましたが、パッケージをロードしてiapi.Configを呼び出せないようです。 iapiコードが動作し、go-icinga2-apiディレクトリに何かを構築すると、うまく動作し、テストはすべてパスします。

私はgo-icinga2-apiをインポートして使用する別のプロジェクト/コードベースを作成したいが、動作させることはできないようだ。

おかげ レン

追加情報。ゴーicinga2-APIの構造がある

client.goは、私はすなわち、1つのレベル、アップ.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 

} 

は同じのために/ IAPIの下にネストされていない

go-icinga2-api 
|-> iapi 
    |-> client.go 
    |-> client_test.go 
    |-> host.go 
     ....... 

結果。

答えて

2

client.go

更新回答は、それはあなたがServer構造体のコンストラクタとしてConfigを使用しようとしているように見えます。 Configは受信者(func (server *Server))で定義されているため、方法はServerであり、直接呼び出すことはできません。 (server *Server)を削除すると、コードは正常に動作するはずです。

タイプがパッケージと同じ名前の場合は、コンストラクタNew[type being returned]またはNewの名前を付けるのは慣用です。 Package Names section of Idiomatic Goの第三段落から

:リングがあるので、

ring.Ring-の新しいインスタンスを作成する機能は、ゴーなり、通常NewRing呼び出すことで、コンストラクタの定義ですが、唯一のパッケージによってエクスポートタイプ、およびパッケージは、リングと呼ばれているので、それがパッケージのクライアントがring.New

オリジナル回答

として見るだけで新しい、と呼ばれています

インポートパスはディレクトリを参照する必要があります。コードでは、そのディレクトリ内の.goファイル内のpackage [name]で使用されている名前で、そのパッケージを参照します。例えば

github.com/lrsmith/go-icinga2-apiはライン package iapiapi.goと呼ばれるファイルが含まれている場合は、あなたのインポートパッケージは、次のようになります。

package main 
import (
    "github.com/lrsmith/go-icinga2-api" 
) 
func main() { 
    t := iapi.Config("zaphod","beeblebrox","http://localhost",true) 
} 
+0

私は質問を更新してください。 go-icinga2-apiのファイルは、dir/iapiの下の1つのパスになります –

+0

ありがとう、それは問題でした。私は新しい関数Newを作成し、それを呼び、期待通りに機能します。 –

1

注コンフィグの宣言を()関数:

func (server *Server) Config(username, password, url string, allowUnverifiedSSL bool) (*Server, error) 

これは、サーバーオブジェクトに適用する "メソッド"です。

server.Config(...) 

したがって、あなたが最初のサーバーオブジェクトを作成する必要があります(または、あなたがnilを試みることができる):

var server iapi.Server 
server, err := server.Config(...) 

あなたはそれが次の宣言を持っていたかのようにそれを実行しようとしている:

func Config(username, password, url string, allowUnverifiedSSL bool) (*Server, error) 
+0

Iが可変最初に宣言するzaphod.go修飾が、私は同じエラー 'パッケージメイン インポート( "github.com/lrsmith/go-icinga2-api/iapi" ) FUNCメイン(){ を得ますvarサーバiapi.Server サーバ、_ = iapi.Config( "zaphod"、 "beeblebrox"、 "http:// localhost"、true) } '' '' '' '$ go build #github.com/ lrsmith/zaphod ./zaphod.go:7:undefined:iapi.Config''' –

+0

最初に宣言するのがなぜうまくいかなかったのか分かりません。代わりに、構造体のメソッドではないように設定を調整して作業を行うように見えました。しかし、私はそれを宣言して、メソッドを呼び出すと期待していたでしょう。 –