如何从for循环内的函数返回一个字符串?

时间:2018-03-01 21:48:18

标签: go

我有一个我写过的函数,我希望它能返回一个字符串。我在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
}

2 个答案:

答案 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

}