【问题标题】:if/else condition defines variable. undefined: dat (variable)if/else 条件定义变量。未定义:dat(变量)
【发布时间】:2017-02-06 18:20:33
【问题描述】:

我知道这是一个基本问题,但我很好奇为什么下面的代码不起作用。没有不声明此变量的用例。

if (bundled == "true") {
            dat, err := Asset("index.html")
        } else {
            dat, err := ioutil.ReadFile("./index.html")

        }
        if ( err != nil) {
            os.Exit(0)
        }

        t, _ = t.Parse(string(dat))
        p := Person{Scope: ""}
        t.Execute(w, p)

我得到了错误

.\run.go:262: undefined: dat

我确定这只是我仍在学习的基本 GOLANG 内容。

感谢您的支持

【问题讨论】:

  • if-else 块有自己的范围。 dat 在它们之外不可见。您可以在if (bundled == "true") 之前声明var dat []byte 来修复它。阅读:Declaration scopes in Go
  • 如何以我可以完成此请求的方式声明 dat。有没有办法创建一个占位符。我没有意识到 if/else 在他们自己的空间中。有趣
  • 在你想要的范围内声明变量。供参考:golang.org/ref/spec#Declarations_and_scope

标签: variables go static


【解决方案1】:

if-else 块有自己的范围。在您的情况下,dat 在它们之外是不可见的。

您可以在if (bundled == "true") 之前声明var dat []byte 来修复它。

文档:https://golang.org/ref/spec#Declarations_and_scope

您可能还想阅读:Declaration scopes in Go

【讨论】:

  • 好的,我编译好了,看看能不能用。我必须事先声明 dat:= []byte{}
  • 建议首选var dat []byte 而不是dat := []byte{}。主要原因是前者定义了一个 nil 切片,而后者定义了一个 empty 切片。这不仅使检查切片更容易,而且避免分配切片,直到您向其附加一些内容(在这种情况下,无论如何您都只是丢弃了原始分配)。此外,您需要事先声明 err 变量并完全消除 if 语句中的短格式赋值,否则您最终只会屏蔽 dat 变量。
  • @Kaedys @dat := []byte{} 不分配内存。
  • dat := []byte{}dat := make([]byte, 0). It doesn't allocate any space, but it *does* assign an address to the pointer in the slice header (pointing to a 0-length array that takes up no memory). This is, technically, more expensive than simply creating the slice header itself, and is also useless, since append() 具有相同的效果,无论如何,仍然必须在第一次调用时创建一个新数组。它也更丑陋,但这只是我。此外,dat == nil 仅适用于 var 版本。最后,golint 专门检查并抱怨这样的空字面量。
  • 空切片的主要用例(空文字或make([]type, 0),尽管后者是首选)是程序是否返回切片(直接,或作为更大数据结构的一部分) 通过 API 编码系统,如 JSON 或 Thrift 等。在这些情况下,nil 切片在大多数编码中被编码为 null,而空切片被编码为 [ ](或您使用的任何编码中的等价物)。
猜你喜欢
  • 1970-01-01
  • 2017-03-21
  • 2011-06-11
  • 2021-02-27
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多