使用命名返回类型时不使用变量

时间:2019-04-09 10:34:26

标签: go iterator closures

为什么要执行以下操作在Go中定义迭代器:

func f() func() int {
    i := 1
    return func() int {
        i++
        return i
    }
}

但这会导致未使用变量错误(未使用i)?

func f() func() int {
    i := 1
    return func() (i int) {
        i++
        return
    }
}

主要功能:

func main() {
    iter := f()
    fmt.Println(iter())
    fmt.Println(iter())
    fmt.Println(iter())
    fmt.Println(iter())
}

对我来说,两个版本的功能完全相同:它们使用f作为迭代器。 f利用了闭包(更具体地说是i)。第一个版本通过命名返回类型显式地返回递增的i,第二个隐式地返回。

对我来说,两个版本都相同,为什么我会收到错误消息?

1 个答案:

答案 0 :(得分:5)

在第二种情况下,返回值(i int)遮盖了外部声明i := 1。因此,这是第一个i未使用。这意味着第二个例子根本不是闭包。

从范围的角度来看,您的第二个示例与以下示例相同:

func f() func() int {
    i := 1
    return func(i int) int {
        i++
        return
    }
}

在这种情况下,应该清楚地知道内部i是不同的,并且遮蔽了外部 string serverKey = "234ddsd2424sdfcsfc3443cfsc"; string FCMURL = "https://fcm.googleapis.com/fcm/send"; string[] tokenId = { "dhr9oDxpEk8:APA91bEQkiwJ57s2NjgyjdvQDankXWXUiBQ95jiGYZNjtETu6M-uMVrRnh5VK2_Zh-TpkH4z5h51Nqm3WUn1sxsczHfvsAva17XE97BQbi2Lyd8-74aBKjLO8a7DE-s_1ry4pBcjQzRa" , "dtBlERGdhA8:APA91bGhb5vOmGgkfwgCr-l4kuvNwthH0xsaH2uRyJBaYYIvYQNxEFg3KZWBeDcYPrJuL5yd5yPM6wW40tj7fy_JrsXDCUCuFP4SUU4wSwvhw7VqLQViUJWNWNEePn77i3Gvc1DSabN1"}; WebRequest webRequest = WebRequest.Create(FCMURL); webRequest.Method = "post"; webRequest.ContentType = "application/json"; var objNotification = new { registration_ids = tokenId, data = new { title = "Test", body = "Testing", sound = "default", icon= "CT_Logo.png" } }; string jsonNotificationFormat = Newtonsoft.Json.JsonConvert.SerializeObject(objNotification); Byte[] byteArray = Encoding.UTF8.GetBytes(jsonNotificationFormat); webRequest.Headers.Add(string.Format("Authorization: key={0}", serverKey)); webRequest.Headers.Add(string.Format("Sender: id={0}", serverKey)); webRequest.ContentLength = byteArray.Length; webRequest.ContentType = "application/json"; using (System.IO.Stream dataStream = webRequest.GetRequestStream()) { dataStream.Write(byteArray, 0, byteArray.Length); using (WebResponse webResponse = webRequest.GetResponse()) { using (System.IO.Stream dataStreamResponse = webResponse.GetResponseStream()) { using (System.IO.StreamReader tReader = new System.IO.StreamReader(dataStreamResponse)) { String responseFromFirebaseServer = tReader.ReadToEnd(); FCMResponse response = Newtonsoft.Json.JsonConvert.DeserializeObject<FCMResponse>(responseFromFirebaseServer); if (response.Success>0) { } } } } }