在Go Web服务器示例中,此处为:http://golang.org/doc/effective_go.html#web_server

下面的代码行是有效的

var addr = flag.String("addr", ":1718", "http service address")

但是把它改成

addr := flag.String("addr", ":1718", "http service address")

是编译错误.为什么?函数的返回类型是*string而不是string,这和表面有什么关系吗?那有什么不同呢?

UPDATE:谢谢你指出最高层是不允许:=的.你知道为什么规格里会有这种不一致吗?我看不出挡路内部的行为有什么不同的理由.

推荐答案

关于更新后的问题:长声明和短声明之间实际上是有区别的,短声明允许重新声明变量.

spec:

与常规变量声明不同,短变量声明可能会重新声明变量,前提是它们最初是在同一块中以相同类型声明的,并且至少有一个非空变量是新的.因此,重新声明只能出现在多变量短声明中.重新声明不会引入新变量;它只是将一个新值赋给原始值.

field1, offset := nextField(str, 0)
field2, offset := nextField(str, offset)  // redeclares offset
a, a := 1, 2                              // illegal: double declaration of a or no new variable if a was declared elsewhere

所以我想说:=算符不是纯declare,而是更像declare and assign.

另一个原因可能是语法简单.在围棋中,所有顶级表格都以typevarfunc开头.简短的声明会毁掉所有的可爱.

Go相关问答推荐

如何使用GO GIN从Auth0 JWT内标识检索权限

创建服务时云运行触发器执行失败

使用goqu无法获取响应

如何将任何类型的数据值传递到 Golang 中的 GRPC Protobuf struct ?

命令行参数在 Golang 程序中不正确地接受为参数

在 Golang 中查看目录是否可写的跨平台方式?

我无法使用反向代理更改主机标头

从单词中删除特殊字符

GitHub 中 REST API 的 aws 凭证问题

golang yaml 马歇尔网址

有没有办法计算枚举中定义的项目总数?

Golang 中的泛型类型转换

使用 ssh 从私有 gilab 仓库导入一个 go 项目:未知修订

如何过滤来自 fsnotify 的重复系统消息

Golang 构建多平台问题

将shell输出绑定到Go中的 struct 的最佳方法?

go 是否对 struct 使用空间填充之类的东西?

使用 delve 在容器中调试 Golang:container_linux.go:380:启动容器进程导致:exec:/dlv:stat /dlv:没有这样的文件或目录

Unescape 在 rss 中两次逃脱了标题

go 堆栈跟踪:在某些函数调用参数或返回值之后的问题(?)标记是什么意思?