【问题标题】:Go declared and not used logic [duplicate]Go已声明且未使用逻辑[重复]
【发布时间】:2018-11-22 01:56:00
【问题描述】:

以这个非常简单的例子为例。它显示了一个块内外的变量赋值。

编译时结果为:u declared and not used

var u string
{
    u, err := url.Parse("http://bing.com/search?q=dotnet")
    if err != nil {
        log.Fatal(err)
    }
}
log.Debug(u)

这模拟了一个逻辑块,在此期间我们可能会评估几件事情并根据逻辑评估将 var 设置为我们喜欢的值。这怎么可能?

【问题讨论】:

  • 正如所说的那样,块内声明的u 未被使用(实际错误会告诉您确切的行)。这里没有什么神奇之处,错误可能使您免于代码中的错误。
  • 短变量声明将创建新的u 和err 变量,因为u 没有在同一个块中声明。只有在同一块中声明变量时,才会发生重新声明。
  • 不敢相信没有人用一句话来清除一切:u, err := 是在一个块内声明和分配u 和err,屏蔽 在更高范围内声明的var u string。

标签: go


【解决方案1】:

请注意:

u, err := url.Parse("http://bing.com/search?q=dotnet")

在这行代码中,您有块作用域变量u,这与在行中声明的变量不同:var u string,因此您有此错误。
此外,您还可以在外部块范围内对变量 u 进行遮蔽,这可能会导致错误,请参见:

var u string
u = "blank"
{
    u, err := url.Parse("http://bing.com/search?q=dotnet")
    if err != nil {
        log.Fatal(err)
    }
    log.Printf("%#v", u)
}
log.Printf("%#v", u)

结果将是:

2018/11/21 19:12:33 &url.URL{Scheme:"http", Opaque:"", User:(*url.Userinfo)(nil), Host:"bing.com", Path:"/search", RawPath:"", ForceQuery:false, RawQuery:"q=dotnet", Fragment:""}
2018/11/21 19:12:33 "blank"

正如您在此处看到的,您甚至拥有不同的数据类型,并且变量 u 在此块之后没有更改。

【讨论】:

  • 感谢您的评论。似乎仍然让我有点难以理解的是如何访问逻辑块中设置的变量的设置值。举个简单的例子 - if { u="bob1"}else{ u = "bob2"} log.Printf(u)
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 2021-05-02
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
相关资源
最近更新 更多