我有一个我写过的函数,我希望它能返回一个字符串。我在for循环之前声明了变量,但是当我尝试在函数结束时返回它时,它声称变量未使用。返回其他类型时我似乎没有问题。我想知道我做错了什么。
func GetInstanceAlarms(instance *Instance) string {
params := &cloudwatch.DescribeAlarmsInput{}
c := cloudwatch.New(session.New())
resp, err := c.DescribeAlarms(params)
var Arn string
if err != nill {
panic(err.Error())
}
for idx := range resp.MetricAlarms{
for _, alarm := range resp.MetricAlarms[idx].Dimensions{
if *alarm.Name == "InstanceId" && *alarm.Value == instance.InstanceId{
log.Println(resp.MetricAlarms[idx].AlarmArn)
//claims this variable is unused
Arn := resp.MetricAlarms[idx].AlarmArn
}
}
}
return Arn
}
答案 0 :(得分:1)
在for
循环中,您重新创建了一个变量Arn
shadow 外部变量。请记住,:=
会创建新变量,而=
会分配给现有变量。
Arn := resp.MetricAlarms[idx].AlarmArn
此Arn
变量仅在其包含块中有效,一旦退出块,在循环之前创建的外部变量Arn
将再次可见。
不是创建新变量,而是分配给现有变量。
Arn = resp.MetricAlarms[idx].AlarmArn
详细了解scope in Go。
运行go vet
应该会遇到此问题。
答案 1 :(得分:1)
在你的代码中你有错误!= nill,改为err!= nil
我检查了你的代码,我没有看到任何问题。一旦声明了var Arn字符串,默认情况下它就是零值,即空字符串""。
我使用以下代码测试了(Mac Os),但我没有看到任何错误。我还添加了代码来打印版本和操作系统。
package main
import (
"fmt"
"runtime"
)
func main(){
fmt.Printf("Checking on %s OS with Go version %s\n",runtime.GOOS, runtime.Version())
fmt.Println(test())
}
func test() string {
var a string
for i:=0;i<5;i++{
a:="string"
return a
}
return a
}