试图找到这个perl数组的golang等价物
我是一个学习围棋的perl脚本编写人员。在perl中,无需逗号和引号即可轻松创建数组,如:试图找到这个perl数组的golang等价物,go,Go,我是一个学习围棋的perl脚本编写人员。在perl中,无需逗号和引号即可轻松创建数组,如: my @array = qw/ Hello World Won't you be my friend /; golang提供这种简单性吗?或者我必须使用括号吗?Go没有Perl的qw这样的特殊语法,但您可以使用它将字符串拆分为一段字符串: a := strings.Fields(` Hello World Won't you
my @array = qw/
Hello
World
Won't
you
be
my
friend
/;
golang提供这种简单性吗?或者我必须使用括号吗?Go没有Perl的qw这样的特殊语法,但您可以使用它将字符串拆分为一段字符串:
a := strings.Fields(`
Hello
World
Won't
you
be
my
friend`)
惯用方法是使用复合文字:
a := []string{"Hello", "World", "Won't", "you", "be", "my", "friend"}
依我看,在Go中形成该数组切片的唯一正确方法是:
slice := []string{"Hello", "World", "Won't", "you", "be", "my", "friend"}
这是创建字符串切片的标准方法。它100%可读。这并不令人惊讶
相比之下,IMO,在Perl中形成该数组的唯一正确方法是:
my @array = ( "Hello", "World", "Won't", "you", "be", "my", "friend" );
qw
操作符虽然在初学Perl的程序员中被广泛理解,但并不直观。是的,它允许您保存一些按键。但是,编写代码应该是为了可读性,而不是为了编写能力。据估计,大多数代码的读取量是编写量的10倍。在某些情况下,它的读取量可能是其写入量的数百倍或数千倍(想想核心库组件)。那么,你到底为什么要牺牲可读性来节省一些按键呢
即使您认为qw
在Perl社区中得到了足够广泛的理解,可以证明它在Perl中的使用是合理的(这是一个强有力的例子),但这个论点肯定不会延续到Go中。Go讨厌聪明的快捷方式,支持代码可读性
当然也有“聪明”的选择,比如@CeriseLimón的答案中提供的选择,但它们降低了可读性。如果在我正在阅读的某些代码中,在该上下文中遇到strings.Fields
,它将中断读取代码的流程。我不得不停下来思考“作者为什么要使用它?这里有什么特殊情况?为什么不能使用标准的切片声明?”然后一两分钟后,我可能会意识到“作者只是因为没有真正的理由而过于聪明了。Pfft”,然后我不得不在代码阅读中进行备份,并重新跟踪我的步骤以恢复流程
聪明是好的可读代码的敌人。我完全理解那些渴望
@langs=qw(fortran pascal perl go)
的人——这是我使用最多的perl习惯用法之一,因此我觉得非常清楚
Go也重视简洁性,但这是一个您无法获得编译器帮助的领域,它必须在运行时完成。这是要付出代价的
e、 g
如所示,无论go习惯用法/最佳实践如何,您都可以将与用于Perl代码的类似样式/效果:
func main() {
arr := strings.Fields(`
Hello
World
Won't
you
be
my
friend
`)
fmt.Printf("OK: arr=%q", arr)
// OK: arr=["Hello" "World" "Won't" "you" "be" "my" "friend"]
}
是的,上面的是=)括号有什么问题吗?我不会称这种语法为“简单”,我认为这显然是误导和不清楚的。大多数人会称Perl的
qw
运算符(以及大约90%的其他语言特性)模糊了复杂性。他们允许编写短代码,但可读性却让我成为噩梦。为什么我问这个问题会被罚3分?虽然答案是好的,但我仍然认为@Flimzy更擅长提问,因为他试图解释为什么OPs方法不好。但要抵制否决票;-)
func main() {
arr := strings.Fields(`
Hello
World
Won't
you
be
my
friend
`)
fmt.Printf("OK: arr=%q", arr)
// OK: arr=["Hello" "World" "Won't" "you" "be" "my" "friend"]
}