Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试图找到这个perl数组的golang等价物_Go - Fatal编程技术网

试图找到这个perl数组的golang等价物

试图找到这个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

我是一个学习围棋的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 
      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"]
}