Tシャツに使用されていたものから派生しました。ライセンスが適用されています。我々は、冒険心があり、いろいろと試し楽しめる人を望んでいます。すべてのプログラマではないです、しかし我々は十分にさらなる発展を正当化するため提供しているアプローチで満足感を得ることを望んでいます。ソフトウェアを記述するように考案されています。大規模なプロダクトで使用するために、十分に成熟してはいません。一方で、我々はまたサーバ環境としての候補として、Goを使って、実験を続け開発をしています。一息というところです。背後にあるサーバーは、Goでできています。それはちょうどgodocドキュメントサーバーが動作しているという事実です。C/C++プログラムとリンクできますか?¶2つのGoコンパイラの実装では、”6g”他がり、一般的にGCかgccgoが呼ばれています。GCを使用すると、別の呼び出し規約とリンカのため、唯一のCプログラムとリンクすることができます。これは、Cコンパイラであって、C++コンパイラではありません。GCCのフロントエンドとして使うことができ、GCCでコンパイルされた、C/C++プログラムとリンクすることができます。ガベージコレクションをするため、単純にリンクさせることは、賢明ではありません。“外部関数インターフェイス”は、Goのコードから安全に、”C”で書かれたライブラリを呼び出すことができます。我々は、SWIGを使って、C++ライブラリが利用できるようになることを期待しています。C/C++からGoコードを安全に呼び出す方法はまだありません。buffer”のライブラリとジェネレータを取り込みます。データリフレクションを使っていますので処理時間は遅いです。新しい実装を計画しています。Goのホームページを他の言語に翻訳してもいいですか?¶もちろんです。私たちは開発者たちにGo言語のサイトを彼ら自身の言語に翻訳することを推奨しています。あるガイドラインを遵守する必要があるでしょう。設計¶なぜGoにはXという機能がないのですか?¶どんな言語であっても、目新しい機能が含まれている反面、誰かが好きな機能を省略することがありえます。Goはプログラミングの喜び、コンパイル速度、概念の直交性、並列実行やガーベジコレクション機能のサポートに重点をおいてデザインされています。みなさんの好きな機能がないとすれば、それはコンパイル速度や明確な設計などとマッチしないか、基本的なシステムのモデルを複雑にしてしまうから、という理由からだと思います。Goに機能Xがないために苦労を強いられているのであれば、私たちに恨みを向けないで、Goが持っている機能を調べてみてください。したらXの機能が欠けている部分が、面白い方法で補完されているの、というのを見つけることができるかもしれません。オブジェクト指向プログラミング¶Goはオブジェクト指向言語ですか?¶イエスとも言えますし、ノーとも言えます。Goは型もメソッドもあり、オブジェクト指向のスタイルのプログラミングを行うことができますが、型には階層はありません。Goでは”インタフェース”という概念が提供されていて、今までとは異なるアプローチを行うことができます。私たちは簡単に使えると信じていますし、いくつかの方法の中ではより汎用的だと思っています。他の型に対して、型を埋め込んで類似のモノを提供するということもできますが、サブクラスとは異なります。そのうえ、GoメソッドはC++かJavaよりも汎用的です。構造体だけでなく、あらゆる種類のデータに対して定義することができます。型の階層がないということは、Goの”オブジェクト”はC++やJavaなどの他の言語よりも軽量である感覚を与えます。どのようにすれば動的ディスパッチが行えますか?¶メソッドのダイナミックディスパッチを行う唯一の方法は、インタフェースを通じて呼び出す方法になります。構造体やその他の型に定義されたメソッドは、常に静的に解決されます。私たちは、まだそれを完璧には定義していませんが、アトミックという状態に関する詳細情報は、Goのメモリモデルの定義の中で読むことができます。並列に関する質問に関しての詳細については、言語設計のFAQの中で説明しています。ミューテックスに関しては、syncパッケージで実装されていますが、多くのプログラマが、より高級なテクニックにトライしようとすることを願っています。一度に一つのgoroutineだけが特定のデータに関する責任を持つようにプログラムする、という構造にすることを考えてください。共有メモリを使ったコミュニケーションはしなようにしてください。代わりに、コミュニケーションを利用した共有メモリを使用してください。コードの記述¶ライブラリのドキュメントはどのように記述されますか?¶Goにはソース中からドキュメントの部分のみを抽出するgodocという機能があります。これはコマンドラインやWeb上で使用することができます。全体がgodocで実装されています。結論から言うと、命名やレイアウト、ファイルの構成といった最小限のルールしか存在しないでしょう。Goのドキュメントにも、いくつかコーディングスタイルの参考になるものがあります。直接的には、gofmtがレイアウトのルールを強制するpretty-printerになっています。gofmtはソースを、構文として許された妥当な要約(すべきもの、せざるべきもの)に置換します。リポジトリ内のすべてのGoのコードは、gofmtを通してあります。Goのライブラリにパッチを当てるにはどうすればいいですか?¶ライブラリのソースはgo/src/pkgにあります。重要な変更をしたければ、着手する前にメーリングリストで議論するようにしてください。Goプロジェクトに貢献するために、どのな手順で進めたら良いかについてのより詳しく書かれたドキュメントがあるので、それを見てください。複数ファイルからなるパッケージを構成するにはどうすればいいですか?¶ディレクトリにパーケージ化したい全てのソースファイルをまとれば、ソースファイルは必要に応じて他のファイルのアイテムを参照出来ます。ヘッダーの定義や事前の宣言等は必要ありません。複数ファイルからなるパーケージも、単一ファイルのようにコンパイルやテストをすることができます。ユニットテストはどのように記述しますか?¶パッケージのディレクトリ内に_test.goで終わるファイルを新規作成してください。ファイル内で”testing”モジュールをインポートし以下のような関数を定義します。...}ディレクトリ内でgotestを実行します。スクリプトはテスト関数を見つけるとテストバイナリをビルドし、テストを実行します。アサーション機能は無いのですか?¶Goはアサーション機能を提供しません。アサーションが便利なのは否定できませんが、我々の経験上プログラマは、それを適切なエラー処理とエラー出力を避けるために使っています。適切なエラー処理とは、サーバがクラッシュする代わりに致命的ではないエラーを発生するにとどめ、処理を続けられるということを意味しています。適切なエラー出力は、エラーが直接的や部分的だったとき、クラッシュ時の膨大なトレースを翻訳する作業からプログラマを開放することを意味します。正確なエラー出力は、エラーを見つけたプログラマーがそのコードに精通していない時ほど重要です。同じことが、テストプログラムにassert()を使った時にも言えます。適切なエラー処理は、例えば、あるテストが失敗しても、そこで停止せず次のテストも続けて実行することができるということを意味しています。することで、あるバグを直そうとしたとき、全体として何がおかしいのかを把握することができるからです。isPrimeという素数判定をテストするとき、2,3,5,7(もしくは2,4,8,16)という入力に対し、2という数字で誤った答えを返してそこでテストが停止してしまうよりも、誤った答えを返しながらもテストを続行し、全ての数字を評価する方が、原因を探る上で都合が良いでしょう。テストを実行してバグを出したプログラマがそのコードに精通しているとは限りません。今良質のエラーメッセージを記述するために費やした時間は、後にテストが失敗したときに報われるでしょう。テストで、もし良いエラーを書くために何度も何度も大量に余分なコードをかく必要があるように見えても、それは良い机上テストの代わりになる可能性があります。Goはデータ構造のリテラルに対するすばらしいサポートを備えています。Goの言語使用やライブラリには、最近の言語の慣習に反する部分があることは理解しています。それは、単純に私たちがそれらの慣習とは違ったアプローチを試してみる価値があると考えたからなのです。フロントエンドとなり、再帰パーサーにより、標準のGCCのバックエンドを利用できます。パーサとして利用し書かれています。は新しいプログラムです。ローダとは異なるELFバイナリを使用します。コンパイラに関して熟考しました。そのものではなく、ブーストラップの難しさとオープンソースでの配布、特にGo環境をセットアップをする上で、Goコンパイラは必要であるためです。適したコンパイラです。優れた言語で、コンパイラのための実装があります。使うことを熟考しました。LLVMではとても大きく遅かったため、パフォーマンス目標を満たせないと感じました。今回も問題の独立のために、ランタイムは、C言語と少しのアセンブラです。今ではほとんどの実装が可能です。ランタイムは、glibcを使っています。カスタムライブラリを使っており、変更履歴を管理しています。Cコンパイラとコンパイルしたものは、セグメントスタックのgoroutinesをサポートします。スタック管理機能を提供するために進行中です。