Go Wiki:如何提问
快速介绍
想象一下,您想知道如何从“Old street”到“New street”。您致电给一个随机的人寻求帮助,并询问“我如何最快地从 Old street 19 到 New street 3?”。随机的人能够帮助您吗?
世界上有很多“New”和“Old”街道,所以首先他需要知道您在哪个国家和城市。如果街道布局很复杂,那么您可能需要说出您附近的一些建筑物。当然,由于速度是一个问题,因此您的交通方式也很重要;您是步行、骑自行车、开车还是开卡车?您可以步行进入卡车无法进入的地方。
围绕直接问题“我如何 X?”的这些问题是问题的背景,它可以帮助其他人了解问题。在没有背景的情况下提供建议可能意味着对方会描述错误的城市。
面对面很容易提出这些问题,而且可以快速连续地进行,但在论坛上,这会导致很多可以避免的来回提问。那么,如何正确地提供问题的背景?
如何提出一个好问题
论坛上的用户时间有限。因此,为了加快速度,这里提供了一个小模板,用于提出问题,这样可以更快地获得更好的答案
你遇到的问题的要点。
你是如何遇到这个问题的?
你想要实现什么?
问题的背景是什么?
解决方案的要求是什么?
特定于上下文的约束/属性是什么?
你在 play.golang.org 上的可编译和可运行的示例。
关于情况的其他说明(生产/学校/玩耍/学习)
需要记住的事情
- 花时间检查拼写,确保你的句子可读。
- 解决方案可能与直接问题相去甚远。因此,确保问题包含对 5 个为什么 的回答。该模板隐式地已经包含了对 3 个为什么的回答。
- 问题的背景很重要,所以一定要提供一个。不提供背景可能会伤害你,因为你得到的答案更适合于不同的背景。背景是最终用户或领域问题和目标,以及它如何尝试解决它的信息。
- 尽量不要提出抽象问题,但如果你这样做,那就添加多个具体示例。没有具体示例地询问抽象问题(通常)会浪费时间。虽然它们有时可能很有趣,但具体示例可以让讨论更加准确。
- 避免使用不准确的术语,例如“大量数据”或“需要快速工作”。给出一些可衡量的东西,例如“它需要处理高达 1GB 的数据”或“它需要在 100 毫秒内与 1000 个并发客户端通信”。
- 如果你无法用 Go 提供可编译的示例,任何语言都可以……很多人精通其他语言。如果你无法使其编译或运行,也没关系。
- 尝试解释你的情况
- 注意“这是家庭作业”意味着人们可以解释得更多,而不会为你做家庭作业。
- 诸如“需要在 X 节点集群上运行”之类的信息可以提供情境背景。代码最终必须在哪里以及如何运行。
- 注明“用于学习 X”可以明确表示您试图更深入地了解不同的方法。
- 注明“我受保密协议约束,无法透露代码”,意味着人们不会费心去索要。尽管您仍应尝试提出类似的情况,但这有助于回答者。
- 注意“这是家庭作业”意味着人们可以解释得更多,而不会为你做家庭作业。
- 提供一个简化的示例可能对读者有帮助,但不要忘记也提供完整版本。简化版本与完整版本不同,因此解决方案可能不同。
当然,不要太担心……您无法回答所有可能的问题。没有必要写一篇关于整个事情的 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
即可。当然,这可能不是全部。提问者现在又提出了另一个问题
耶,反射工作了,但不够快。
如何才能让它更快?
“更快”是什么意思?他试图做什么?因此,您需要更多地了解问题的具体情况。所以你问:你试图完成什么?
我正在尝试实现一个可以存储泛型类型的 set 包。
好吧,但那仍然没有回答为什么需要更快。为什么他使用 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
我在一个程序中使用集合包,该程序遍历多个序列并查找序列中的所有公共元素。序列元素可以是核苷酸或蛋白质。该程序需要能够处理高达 1GB 的数据大小。
我的当前代码可在 github.com/... 中获得。
我为生物信息学课程编写此内容,因此我需要自己实现它。
摘要
- 最佳答案取决于上下文。在某些情况下,research.swtch.com/sparse 可能更合适。如果速度不重要,则使用
map
就足够了。因此,需求也很重要。
- 问题可能出在其他地方。正如您所见,回答者并未预期程序的结构有错。使用带有
map
的结构NucleotideIndex
意味着他必须使用反射构建复杂的东西。通常,当您修复更高级别的问题时,其他所有问题都会变得容易得多。
- 约束/属性很重要。属性“按升序使用集合元素”意味着有一种简单的方法,不需要一个成熟的
set
实现。这种专门的结构可以快得多。有关系统、上下文或域的信息可能会使问题变得简单得多。
- 解决方案可能与您通常的方法不同。也许提问者决定使用
reflect
包,因为他在 Java 中习惯了泛型。Go 是一种不同的语言,因此最终解决方案可能与 Java 中的解决方案有很大不同。
更多提示
此内容是 Go Wiki 的一部分。