2017-11-14 24 views
-1

この質問は以前に尋ねられました。私はそれらをすべて見て答えをテストしたと信じていますが、それぞれが私の場合にどう対応しないか説明します。私は私の輸入は、私はよく分からない答えパッケージ "api/handlers"を見つけることができません

Go build: "Cannot find package" (even though GOPATH is set)の構造をたどると信じて、私はそれらのいずれかの答えを逃したかもしれないが、私は一つ一つを読み、それが

How to import local packages in go?私の場合に合うことができるかどうかを確認しようとしましたこれは完全に関係しているが、私はそれが同じエラーだとは思わない。

Golang - Why can't I import local package in GOPATH/src/project but can in home directory?私のインポートパスは相対的ではないので、この質問は関係ありません。

私のエラーは簡単です:次のように

cannot find package "api/handlers" in any of: 
C:\Go\src\api\handlers (from $GOROOT) 
C:\Projects\Go\src\api\handlers (from $GOPATH)` 

マイプロジェクト構造は次のとおりです。

src 
| 
--api 
    | 
    -- index.go 
    -- repo.go 
    | 
    github.com 
    | 
    main.go 

環境変数:

$GOPATH : C:\Projects\Go 
$GOROOT : C:\Go\ 

は、インデックスとrepo.goの両方が同じパッケージを持っています名前、インポート、および空の関数:

package handlers 

import (
    "net/http" 
) 

func indexHandler(w http.ResponseWriter, r *http.Request) { 
} 

マイmain.go:何が起こっている

package main 

import (
    "fmt" 
    "log" 
    "net/http" 
    "api/handlers" 
) 

func main() { 
    http.HandleFunc("/api/index", handlers.indexHandler) 
    http.HandleFunc("/api/repo", handlers.repoHandler) 

    log.Fatal(http.ListenAndServer("localhost:8080", nil)) 
} 
+2

'api'に' handlers'というフォルダはありません。 – tkausl

+0

@tkauslはい、以前の回答で読んだことは、パッケージ名で終わるようです。私が 'api'を実行しようとすると、インポート時のエラーが取り除かれ、' unported name handlers.indexHandler'を参照することができないというエラーがメインに出ます。 –

+0

"重複"の量トポの答えが、特に大文字の部分について、より良い説明を加えると信じています。なぜなら、私は多くのチュートリアルでそれを見逃していたからです。見逃しやすいものがあります。 –

答えて

1

import api/handlersフォルダapiにフォルダhandlersを探して、その後、パッケージ名の内容に見ているということです。 apiの中にhandlersフォルダを追加し、index.gorepo.goをそのフォルダに移動します。または、パッケージ名をapiに変更して、import apiとしてください。あなたのコメントについて

があなたのメインパッケージから機能indexHandlerを使用することができるようにするためにはアンエクスポート名handlers.indexHandler

を参照することができない、あなたはIndexHandlerに名前を変更する必要があり。外出先で他のパッケージからアクセスできるようにするには、大文字で始める必要があります。

+0

したがって、他のフォルダを追加する(またはAPIをインポートする)と、関数を大文字にする(私は完全にドキュメントで欠けていたはずです)という組み合わせが働きました。 他の回答を読むと、インポートを終了したものがフォルダの名前ではなくパッケージの名前であると仮定しました。 –

+1

@ Mr.Smithyyy良い。エクスポートされた関数や変数の文字を大文字にすることについての部分は、構造体を別のパッケージに渡して何かを行うときに見逃しやすいので、エクスポートされていないフィールドを見ることはできません(大文字で始まります)。 – Topo

関連する問題