在此处的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
吗?这有什么区别?
更新 :感谢您指出:=
最高层不允许的内容。知道为什么这种不一致在规范中吗?我看不出该块内的行为有所不同的任何原因。
关于更新的问题:长声明和短声明之间实际上是有区别的,采用这种短格式可以重新声明变量。
根据规格:
与常规变量声明不同,短变量声明可以重新声明变量,只要它们最初是在同一块中以相同类型早先声明的,并且至少一个非空白变量是新变量。因此,重新声明只能出现在多变量简短声明中。重新声明不会引入新的变量;它只是为原始值分配一个新值。
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
因此,我想说:=
运算符不是纯粹的 声明 ,而是更像是 声明和赋值 。不允许在顶层进行重新声明,因此也不可以使用简短声明。
另一个原因可能是语法简单。在全力以赴顶层形式开始任type
,var
或func
。在那里简短声明会破坏所有可爱之处。
问题内容: Go 的用途是什么?语言文档说它在周围的函数返回时执行。为什么不将代码放在给定函数的末尾? 问题答案: 我们通常用来关闭或释放资源。 周围的函数会在返回之前执行所有延迟的函数调用,即使它会慌乱。如果仅将函数调用放在周围函数的末尾,则在发生紧急情况时将跳过该调用。 而且,延迟函数调用可以通过调用内置函数来处理紧急情况。这不能通过函数结尾处的普通函数调用来完成。 每个延迟的调用都放在堆栈中
问题内容: 用go编程语言,为什么在导入软件包后,我仍然必须在该软件包中的方法前面加上软件包名称? 即 这不是多余的吗?例如,在Java中,无需导入文件就可以执行Files.readAllLines等操作。 问题答案: 我想这并不能真正回答您的问题,但是如果您愿意,您实际上可以在不显式说明软件包的情况下调用方法- 只需在名称前面添加一个即可(但不建议这样做;请参见下文): 注意下面@ JIMT的评
问题内容: 可以动态运行以便用于基于插件的应用程序吗? 在eclipse中,我们可以创建一些Eclipse可以动态运行的插件。 Go中可能有同样的事情吗? 问题答案: 我认为这是两个独立的问题: 具有动态负荷 有插件 第一个完全不是:Go程序是静态链接的,这意味着您无法将代码添加到正在运行的程序中。这也意味着您必须编译该程序以使其集成插件。 幸运的是,您可以像大多数语言一样在Go中定义一个接受插件
问题内容: 我一直在尝试找出如何简单地在Go中的单个目录中列出文件和文件夹。 我已经找到了,但是它会自动进入子目录,这是我不想要的。我所有其他搜索都没有发现更好的结果。 我确定该功能存在,但确实很难找到。让我知道是否有人知道我应该去哪里。谢谢。 问题答案: 您可以尝试使用软件包中的ReadDir函数。根据文档: ReadDir读取以目录名命名的目录,并返回已排序目录条目的列表。 结果切片包含类型,
问题内容: 尽管Go已经通过提供了XML抓取功能,但是Go似乎还不支持HTML Web解析工具/包。那么如何在Go中安装软件包? 据我所知,所有答案(至少是我在网上花了10分钟的时间才偶然发现)都没有返回正确的答案。当我尝试运行这些代码时,出现错误或。 因此,到目前为止,我是否可以安装它而无需重新编译并重新设置整个Go环境?还是我错过了什么? 我在OS X 10.8上并运行Go版本1.1,该版本是
问题内容: 我正在尝试在Go项目中使用专有的DLL。 DLL的方法描述之一如下所示: 在我的测试Go项目中,我正在执行以下操作: 库被调用,出现错误消息“路径不存在”,但是我认为我的路径类型不正确。这就是为什么库看不到该文件夹的原因。 也许有更好的方法可以做到这一点?也许这是Go使用情况的坏案例,我应该找到一些软件包甚至语言? 问题答案: 您的路径可能需要NUL终止: