Go Wiki: 質問方法

簡単な紹介

「Old street」から「New street」への行き方を知りたいとします。ランダムな人に助けを求めて、「Old street 19からNew street 3に行くための最速の方法は何ですか?」と尋ねます。そのランダムな人はあなたを助けることができるでしょうか?

世界には多くの「New」と「Old」の通りがあるので、まずあなたのいる国と都市を知る必要があります。通りのレイアウトが複雑な場合は、近くにある建物の名前を挙げる必要があるかもしれません。もちろん、スピードが問題なので、移動手段も重要です。徒歩、自転車、車、トラックのどれですか?トラックでは行けない場所に徒歩で行くことができます。

「Xをどうすればいいですか?」という直接的な質問に関するこれらの質問は、問題のコンテキストであり、他の人が問題を理解するのに役立ちます。コンテキストなしでアドバイスをすることは、他の人が間違った都市を説明することを意味する可能性があります。

直接会って質問するのは簡単で、立て続けに行うことができますが、フォーラムでは、回避できる多くのやり取りが発生します。では、問題のコンテキストを適切に伝えるにはどうすればよいでしょうか?

良い質問をする方法

フォーラムの人々は利用できる時間が限られています。そこで、物事を迅速化するために、より良い回答とより迅速な回答を得るための質問をするための小さなテンプレートを次に示します。

あなたが抱えている問題の要点。


どのようにして問題に遭遇しましたか?
何を達成しようとしていますか?
問題のコンテキストは何ですか?
ソリューションの要件は何ですか?
コンテキスト固有の制約/プロパティは何ですか?
play.golang.orgでのコンパイル可能で実行可能な例

状況に関するその他の注意事項(本番/学校/遊び/学習)

留意すべき点

もちろん、あまり心配しないでください…可能なすべての質問に答えることはできません。全体について4ページのエッセイを書く必要はありません。何かを明確にする必要がある場合は、いつでも質問できます。

悪い質問の物語

なぜそのテンプレートが必要なのですか?回答者の立場になり、この質問を受けたとしましょう。

reflectのSetメソッドをどのように使用すればよいですか?

質問者の視点からすると、これは簡単な問題に見えるかもしれません。もちろん、質問者が何をしようとしているのかはわかりません。彼は値、構造体、配列、またはマップに値を設定しようとしているのでしょうか?つまり、最初の質問をする必要があります。例を挙げていただけますか?

これで、質問者は例を提供します。

基本的にはこれをしようとしています
    m := make(map[string]int)
v := reflect.ValueOf(m)
key := reflect.ValueOf("hello")
val := reflect.ValueOf(123)
v.MapIndex(k).Set(val)
print(m)
しかし、パニックが発生するだけです。

今では、コンパイルすらされないコードがあります。つまり、どこかにコピーペーストして、間違いを修正する必要があります。play.golang.orgに配置すると、問題がわかりやすくなります(例:play.golang.org/p/fCxBlL9V4Y)。

修正は簡単です。代わりにSetMapIndexを使用するだけです。もちろん、それがすべてではないかもしれません。質問者は別の問題で戻ってきます。

やったー、リフレクションが動作しましたが、十分な速度ではありません。
どうすれば速くできますか?

「高速」とはどういう意味ですか?彼は何をしようとしているのですか?そこで、問題の詳細についてさらに質問する必要があります。そこで、何を達成しようとしていますか?と質問します。

ジェネリック型を格納できるセットパッケージを実装しようとしています。

なるほど、しかし、それがなぜ高速である必要があるのか​​についてはまだ回答されていません。mapを使用できるのに、なぜ彼はそのためにreflectを使用しているのですか?そこで、あなたは答えます。代わりにmapを使用できませんか(たとえば、map[type]struct{})?setパッケージを何のために書いているのですか?

複数のシーケンスを調べて、共通の要素を見つけるプログラムを作成しています。
主な用途はヌクレオチドで使用することであり、大きなデータセットで動作する必要があります。また、別の型で表されるタンパク質でも動作する必要があります。
はい、map[NucleotideIndex]struct{}は少しうまく機能しますが、それでも十分な速度ではありません。また、タンパク質についても同じコードを作成する必要があります。

ついに必要な情報がすべて揃いました。解決策は簡単です。biogo https://code.google.com/p/biogo/には、大規模なデータセットや並列処理などを処理するために必要なものがほとんど含まれています。また、「NucleotideIndex」とは何ですか?質問者は答えを見つけてありがとうございます。これは本当に素晴らしいですと言うかもしれませんが、次のような可能性があります。

うわー、それは良さそうですが、私は生物情報学コースにいて、そのコードを自分で書く必要があります。「NucleotideIndex」は「struct {Nucleotide Nucleotide; Index int}」です。

それは奇妙に見えますが、なぜそのようにするのでしょうか。それにもかかわらず、私たちは皆、何か愚かなことをしたので…これで、あなたは何か良いことを提案し始めることができます。おそらく、map[Type]map[int]struct{}を処理する方がはるかに簡単でしょう。シーケンスを扱っており、セット要素は常に増加順に使用されるため、インデックスを配列(たとえば、map[Type][]int)に格納するだけで済みます。また、メモリが問題になり始めた場合は、ランレングスエンコードされたセットにすることもできます…

これで、さまざまなセットタイプの(不)利点について、より有意義な議論をすることができます。

この長い例の後、より多くの情報を提供することがなぜ役立つのかを理解していただければ幸いです。最初のやり取りによる質問は回避できたはずです。適切な質問は、質問者と回答者の時間を節約できたはずです。

最初の質問は次のようになります。

MapIndexを使用してreflectのSetメソッドをどのように使用すればよいですか?

セットパッケージのジェネリックマップに値を設定しようとしています。しかし、そうしようとするとパニックが発生します。play.golang.org/p/fCxBlL9V4Y

セットパッケージは、複数のシーケンスを調べて、シーケンス内のすべての共通要素を見つけるプログラムで使用します。シーケンス要素は、ヌクレオチドまたはタンパク質である可能性があります。プログラムは、最大1GBのデータサイズを処理できる必要があります。

現在のコードはgithub.com/...で入手できます。

これは生物情報学コースのために作成しているので、自分で実装する必要があります。

まとめ

その他のヒント

  • 賢明な質問
  • 短く、自己完結的で、正しく(コンパイル可能)、例

    このコンテンツは、Go Wikiの一部です。