2016-06-15 7 views
2

私が見たほとんどのGoプログラムでは、パッケージが1つしかないものでも、型名には大文字が書き込まれ、書き出されます。 (例)Goでは、型名を大文字にする規則がありますか?

これはタイプであることを明確にするための規約ですか、すべてのタイプをエクスポートする必要がありますか?ここで

は、いくつかの例は以下のとおりです。

  • outyet
    (この1つは、私が誤って、コメントを追加しました:。Serverを返しNewServer()、それをエクスポートする必要がありますので)
  • template
+1

エクスポートされるすべてのタイプの必要がありません。大会ではありません。機能上の理由から、パッケージ内の識別子の名前の大文字小文字が選択されます。 – evanmcdonnal

+0

主要なパッケージタイプを大文字で書いている人もあれば、そうでない人もいます。タイプをエクスポートする必要がない場合、他の理由はありません。 – JimB

答えて

0

タイププライベートにすることができます。

ただし、プライベートタイプを返すパブリック関数を使用することはできません。タイプが内部でのみ使用されるパッケージである限り、私はそれを非公開にします。

EDIT: この例では、パブリック関数によって返され、パッケージの外で使用されるため、サーバーはパブリックである必要があります。 NewServer関数は* Serverを返します。

EDIT for new example:

新しい例では、これはメインパッケージです。とにかくそれをインポートすることはできません。

5

大文字で始まるタイプは、他のパッケージにエクスポートされます。小文字で始まるものは、パッケージ内でのみ使用できます。重要な注意:インターフェイスを実装する構造体をエクスポートせずにインターフェイスをエクスポートすることは可能です。

タイプをエクスポートすることはできません。それらをパッケージ外で使用できるようにする場合にのみエクスポートしてください。指定した例では、エクスポートされたフィールドがないため、Serverタイプをエクスポートする必要はありませんでした。

クライアントとの契約の一部であるタイプのみをエクスポートします。内部的にのみ使用されるタイプのエクスポートは間違いであり、ドキュメントでは混乱します。

編集:

Serverタイプについて少し明確化。 http.Handlerインターフェイス(ServeHTTP(http.ResponseWriter, *http.Request)を定義する必要があります)を実装しているため、エクスポートしないで、インターフェイスを戻りタイプNewServerとして使用することは可能です。

+0

実際にはServerの例ではエクスポートされた関数があり、エクスポートされた関数NewServerによっても返されます。それは輸出されなければならない。 – TehSphinX

+1

@TehSphinX 'Server'型は' http.Handler'を実装しているので、 'http.Handler'インタフェースの背後に隠すことができます。 –

+0

はい、あなたは正しいです。しかし、NewServerがhttp.Handlerを返さなければ、Server変数をアンエクスポートする必要はありませんか? – TehSphinX

0

慣例ではありません。実際には、大文字と小文字を使用して、エクスポートされたもの、つまりパッケージをインポートするときに使用できるものを判断します。

など。私が持っている場合:

package a 

const Exported = "hi" 
const nonExported = "mom" 

を次に別のパッケージに、あなたはa.Exportedなくa.nonExportedをインポートすることができます。

package main 

import "PATH/a" 

func main() { 
    println(a.Exported) 
    // this won't compile 
    // println(a.nonExported) 
} 
+0

私はそれがそれらを輸出することを知っている、私は実際に(私は2回)私の質問でそれを書いた。私はなぜそれらのすべてのタイプがその型をエクスポートするのか知りたい。 – AndreKR

関連する問題