Go Wiki:HowToAsk
快速簡介
想像一下,您想知道如何從「舊街」前往「新街」。您隨機撥打電話給某人尋求協助,並詢問「我如何最快從舊街 19 號前往新街 3 號?」這個隨機的人是否能協助您?
世界上有很多「新」街和「舊」街,因此他首先需要知道您在什麼國家和城市。如果街道配置很複雜,那麼您可能需要說出您附近的某些建築物。當然,由於速度是一個問題,因此您的交通工具也很重要;您是步行、騎自行車、開車還是開卡車?您可以在無法開卡車的地方步行。
圍繞著直接問題「我如何執行 X?」的那些問題是問題的脈絡,它有助於其他人了解問題。在沒有脈絡的情況下提供建議,可能會導致其他人描述錯誤的城市。
親自詢問這些問題很容易,而且可以快速連續進行,儘管在論壇上,這將導致許多可以避免的來回問題。那麼,如何正確提供問題的脈絡?
如何提出好的問題
論壇上的使用者時間有限。因此,為了加快速度,以下是一個提出問題的小範本,它將獲得更好的答案並更快地回答
您遇到的問題的要點。
您如何遇到此問題?
您想達成什麼目標?
問題的脈絡是什麼?
解決方案的要求是什麼?
脈絡特定的限制/屬性是什麼?
您在 play.golang.org 上的可編譯和可執行範例
關於情況的其他注意事項(製作/學校/玩樂/學習)
需要記住的事項
- 花點時間檢查拼字,並確保您的句子可讀。
- 解決方案可能遠離直接問題。因此,請務必確保問題包含 5 個為什麼 的答案。範本本身隱含地已包含 3 個為什麼的答案。
- 問題的脈絡很重要,所以務必提供一個。不提供脈絡可能會傷害您,因為您會得到更適合不同脈絡的答案。脈絡是最終使用者或領域問題和目標,以及它如何嘗試解決它的資訊。
- 盡量不要提出抽象問題,但如果您這樣做,請新增多個具體範例。在沒有具體範例的情況下詢問抽象問題(通常)會浪費時間。儘管它們有時很有趣,但具體範例可以讓討論更精確。
- 避免使用不精確的術語,例如「大量資料」或「需要快速運作」。提供可衡量的資訊,例如「需要處理 1GB 的資料」或「需要在 100 毫秒內與 1000 個同時連線的用戶端通訊」。
- 如果您無法提供 Go 編譯範例,可以使用任何語言...許多人都精通其他語言。如果您無法編譯或執行,也沒關係。
- 嘗試說明您的情況
- 請注意「這是作業」表示人們可以多加說明,但不會替您完成作業。
- 例如「需要在 X 節點叢集上運作」等資訊可以提供情境脈絡。程式碼最終必須在哪裡以及如何執行。
- 請注意「這是為了學習 X」清楚表示您嘗試深入了解不同的方法。
- 請注意「我受保密協定約束,無法公開程式碼」表示人們不會費心詢問程式碼。儘管如此,您仍應嘗試提出類似的狀況,這有助於回答者。
- 請注意「這是作業」表示人們可以多加說明,但不會替您完成作業。
- 提供簡化範例有助於讀者理解,但別忘了也要提供完整版本。簡化版本與完整版本不同,因此解決方案也可能不同。
當然,別太擔心...您無法回答所有可能的問題。不需要針對整件事寫一篇四頁的論文。當需要澄清時,人們隨時可以詢問。
一個糟糕問題的故事
為什麼需要那個範本?讓我們讓您站在回答者的角度,假設您收到這個問題
我如何使用 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
即可。 當然,這可能不是全部。提問者現在又帶回另一個問題
耶,我讓反射運作了,但它不夠快。
我如何讓它更快?
「更快」是什麼意思?他想要做什麼?所以你需要進一步詢問問題的具體細節。因此你詢問:你想要達成什麼?
我想要實作一個可以儲存一般型別的集合套件。
好吧,但這仍然沒有回答為什麼需要更快。為什麼他要使用 reflect
來做這件事,而你可以改用 map
。因此你回答:你不能改用 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
。此外,如果記憶體開始成為問題,你可以將其製成執行長度編碼集合……
現在,我們可以對不同集合類型的(優缺點)進行更有意義的討論。
希望在這個冗長的範例之後,你可能了解為什麼提供更多信息很有用。可以避免最初的來回問題。適當的問題可以為發問者和回答者節省時間。
最初的問題可能是
我如何使用Set
方法搭配MapIndex
來反映?
我正在嘗試為集合套件設定通用地圖上的值。但是,當我嘗試執行此操作時,它只會引發恐慌。 play.golang.org/p/fCxBlL9V4Y
我在一個程式中使用 set 套件,這個程式會遍歷多個序列並找出序列中的所有共用元素。序列元素可能是核苷酸或蛋白質。這個程式需要能夠處理高達 1GB 的資料大小。
我目前的程式碼可在 github.com/... 取得。
我為生物資訊學課程撰寫這個程式,所以我需要自己實作。
摘要
- 最佳解答取決於脈絡。在某些情況下,research.swtch.com/sparse 可能會更合適。如果速度不重要,使用
map
就足夠了。因此,需求也很重要。
- 問題可能出在其他地方。正如你所見,回答者沒有預期到程式的結構有問題。使用具有
map
的結構NucleotideIndex
,表示他必須使用反射來建構精細的東西。通常,當你修復較高層級的問題時,其他所有事情都會變得容易許多。
- 限制/屬性很重要。屬性「set 元素按遞增順序使用」表示有一個簡單的方法,不需要一個成熟的
set
實作。這個特殊結構可能會快很多。關於系統、脈絡或網域的資訊可能會讓問題變得簡單許多。
- 解決方案可能與你通常的方法不同。也許提問者決定使用
reflect
套件,因為他習慣於 Java 中的泛型。Go 是一種不同的語言,因此最終解決方案可能與 Java 中的解決方案大不相同。
更多提示
此內容是 Go Wiki 的一部分。