为什么要执行以下操作在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
,第二个隐式地返回。
对我来说,两个版本都相同,为什么我会收到错误消息?
答案 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)
{
}
}
}
}
}
。