为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
沧海一幻觉 2022-09-05 17:58:37
我最近开始学习Go,我很困惑为什么它有一个奇怪的“非传统”语法,不像其他语言(C,C++,C#,JAVA)。例如,Go 中的代码如下所示:package mainimport "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 mainimport "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语法键入它会更有意义?
查看完整描述

2 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

我想强调的几点:

  1. Go的灵感来自许多语言,而不仅仅是C语言。

  • C:语句和表达式语法

  • 帕斯卡:声明语法

  • Modula 2, Oberon 2: packages

  • CSP, Occam, Newsqueak, Limbo, Alef: 并发

  • BCPL:分号规则

  • 小话:方法

  • 新闻吱吱声: <-, :=

  • APL: iota

  • 还有更多

  1. 从什么时候开始并成为C风格的语法?foreachrange

  2. 第三,不要将“For”语句与子句和子句混淆。阅读规格。在 Go 中,您也可以通过以下方式执行此操作:forrange

for i := 0; i < len(numbers); i++

但是,一旦你理解了它,子句就会强大得多,是的,它不是奇怪的语法。我建议阅读规范并查看一些示例。range

  1. 此外,它是Go而不是GoLang(阅读)。总是更喜欢前者而不是后者。

  2. 尝试 Go Tour。一些概念解释得很好。

另外,请阅读Go的FAQPike关于声明语法的博客。常见问题解答应该回答许多这样的问题。


查看完整回答
反对 回复 2022-09-05
?
森栏

TA贡献1810条经验 获得超5个赞

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 函数可以具有命名的返回值:func


func sum(a int, b int) (n int)

我不确定你会如何使用其他语法做到这一点。


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

Go 语法允许您省略类型,而 C 语言则无法做到这一点。


foreach (n in range(numbers))

Go 没有关键字,因为关键字越少,词法解析就越快。相反,您有不同的调用:whilefor


var n int

for {

   if n > 9 {

      break

   }

   println(n)

   n++

}


var n int

for n < 9 {

   println(n)

   n++

}


for n := 0; n < 9; n++ {

   println(n)

}


for range numbers {

   println("hello")

}


for index := range numbers {

   println(index)

}


for index, value := range numbers {

   println(index, value)

}

为此:


result = sum(n, 2)

Go 有两种不同的变量赋值语法:


result := 1

result = 2

第一个是声明,第二个是分配给已声明的变量。


io.print(result)

fmt.Println是大写的,因为任何以大写字母开头的函数都是“公共”函数。这样可以节省打字或任何地方。publicpub


查看完整回答
反对 回复 2022-09-05
  • 2 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号