猿问

Go奇怪的语法背后的技术原因

我最近开始学习Go,我很困惑为什么它有一个奇怪的“非传统”语法,不像其他语言(C,C++,C#,JAVA)。


例如,Go 中的代码如下所示:


package main


import "fmt"


func sum(a int, b int) int {

    return a + b

}


func main() {

    numbers := [4] int {1, 2, 3, 4}


    for _,n := range numbers {

        result := sum(n, 2)

        fmt.Println(result)

    }

}

但是,可以用某些语言写成这样的东西:


package main


import "io"


int sum(int a, int b) {

    return a + b

}


void main() {

    int numbers[4] = {1, 2, 3, 4}

    

    foreach (n in range(numbers)) {

        result = sum(n, 2)

        io.print(result)

    }

}

所以我的问题是,这种语法背后是否有任何技术原因,或者它只是团队的个人偏好?特别是Go背后的团队使用“C语言”来编写Go,这意味着用C-Style语法键入它会更有意义?


沧海一幻觉
浏览 154回答 2
2回答

翻阅古今

我想强调的几点:Go的灵感来自许多语言,而不仅仅是C语言。C:语句和表达式语法帕斯卡:声明语法Modula 2, Oberon 2: packagesCSP, Occam, Newsqueak, Limbo, Alef: 并发BCPL:分号规则小话:方法新闻吱吱声: <-, :=APL: iota还有更多从什么时候开始并成为C风格的语法?foreachrange第三,不要将“For”语句与子句和子句混淆。阅读规格。在 Go 中,您也可以通过以下方式执行此操作:forrangefor&nbsp;i&nbsp;:=&nbsp;0;&nbsp;i&nbsp;<&nbsp;len(numbers);&nbsp;i++但是,一旦你理解了它,子句就会强大得多,是的,它不是奇怪的语法。我建议阅读规范并查看一些示例。range此外,它是Go而不是GoLang(阅读)。总是更喜欢前者而不是后者。尝试&nbsp;Go Tour。一些概念解释得很好。另外,请阅读Go的FAQ和Pike关于声明语法的博客。常见问题解答应该回答许多这样的问题。

森栏

import "io"Go有和包,尽管它们确实有一些重叠。例如,允许您写入任何 ,并允许您从任何 .fmtiofmt.Fprintio.Writerfmt.Fscanio.Reader同样,您可以使用 写入控制台,并使用 从控制台读取。io.Copy(os.Stdout, something)io.Copy(something, os.Stdin)int sum(int a, int b) {我想我读到,通过首先,它使词法解析更快。此外,Go 函数可以具有命名的返回值:funcfunc sum(a int, b int) (n int)我不确定你会如何使用其他语法做到这一点。int numbers[4] = {1, 2, 3, 4}Go 语法允许您省略类型,而 C 语言则无法做到这一点。foreach (n in range(numbers))Go 没有关键字,因为关键字越少,词法解析就越快。相反,您有不同的调用:whileforvar n intfor {&nbsp; &nbsp;if n > 9 {&nbsp; &nbsp; &nbsp; break&nbsp; &nbsp;}&nbsp; &nbsp;println(n)&nbsp; &nbsp;n++}var n intfor n < 9 {&nbsp; &nbsp;println(n)&nbsp; &nbsp;n++}for n := 0; n < 9; n++ {&nbsp; &nbsp;println(n)}for range numbers {&nbsp; &nbsp;println("hello")}for index := range numbers {&nbsp; &nbsp;println(index)}for index, value := range numbers {&nbsp; &nbsp;println(index, value)}为此:result = sum(n, 2)Go 有两种不同的变量赋值语法:result := 1result = 2第一个是声明,第二个是分配给已声明的变量。io.print(result)fmt.Println是大写的,因为任何以大写字母开头的函数都是“公共”函数。这样可以节省打字或任何地方。publicpub
随时随地看视频慕课网APP

相关分类

Go
我要回答