go 语言就很离谱

2020-10-29 11:42:08 +08:00
 leeraya

居然还有 func type 这种东西。今天遇到要循环生成 type func 的对象: type FieldResolveFn func(p ResolveParams) (interface{}, error)

结果循环生成的 func 都是一样的,最后都变成可最后生成的那一个。 该怎么解决啊,老哥们

10957 次点击
所在节点    Go 编程语言
64 条回复
THESDZ
2020-10-29 11:45:03 +08:00
是不是指针的问题,导致被最后一个覆盖了
Glauben
2020-10-29 11:47:52 +08:00
你是怎么生成的,上代码
cmdOptionKana
2020-10-29 11:48:59 +08:00
为什么要这样问问题…… 标题引战,正文又不上代码。
geebos
2020-10-29 11:50:24 +08:00
你要保存函数指针啊
hakono
2020-10-29 11:50:37 +08:00
感觉 lz 这样搞,很可能是自己的问题。。。。
guader
2020-10-29 11:51:18 +08:00
鱼 好大的鱼 虎纹鲨鱼
keepeye
2020-10-29 11:57:43 +08:00
若不是你自己的问题,我吃屎
baiyi
2020-10-29 11:58:10 +08:00
应该是 go 的经典问题,循环的时候传指针了
leeraya
2020-10-29 12:01:23 +08:00
例如:
type Greeting func(name string) string
func main() {

test := make([]Greeting, 3)

nameArr := []string{"lee", "ray", "Pool"}

for index, name1 := range nameArr {
// if index == 0 {
// test[index] = func(name string) string {
// fmt.Println("hello " + name + name1 + strconv.Itoa(index))
// return "hello " + name + name1 + strconv.Itoa(index)
// }
// } else {
// test[index] = func(name string) string {
// fmt.Println("hello " + name + name1 + strconv.Itoa(index))
// return "hello " + name + name1 + strconv.Itoa(index)
// }
// }
test[index] = func(name string) string {
fmt.Println("hello " + name + name1 + strconv.Itoa(index))
return "hello " + name + name1 + strconv.Itoa(index)
}

}
}
debug 看 test 数组,元素都是一样的
FlyingDough
2020-10-29 12:04:36 +08:00
怪 Go?
rrfeng
2020-10-29 12:09:22 +08:00
不怪 Go
coderxy
2020-10-29 12:10:18 +08:00
你这是循环的时候错误的使用了指针吧
lcdtyph
2020-10-29 12:15:37 +08:00
for index, name1 := range xxx {
index, name1 := index, name1
// the rest code...
}
hakono
2020-10-29 12:19:20 +08:00
看了 LZ 的代码原来是这么回事,问题不在闭包,而是 for index, name1 := range nameArr{} 中, 每次循环都是在重复利用 name1 为 name1 赋不同的值 ,name1 本身的值在不停变换
闭包中引用同一个变量的话,那必定是闭包的里变量的值都一样的

https://studygolang.com/articles/14696

```

for index := range nameArr {
tmpName := nameArr[index]
test[index] = func(name string) string {
fmt.Println("hello " + name + tmpName + strconv.Itoa(index))
return "hello " + name + tmpName + strconv.Itoa(index)
}

}
```
改成这样就行了
hakono
2020-10-29 12:22:23 +08:00
都忘了 V2EX 不能回复 Markdown 了
例子: https://play.golang.org/p/4qyRFCv2AMF

关于 for range 这个, 我一般是不太喜欢使用 for idx, value := slice1 的写法的, 因为 value 是指的拷贝,每次循环都要拷贝一遍,大量循环的时候性能会有影响,所以默认都是 for idx := slice1 这样
wangyzj
2020-10-29 12:27:06 +08:00
函数指针
BoarBoar
2020-10-29 12:50:10 +08:00
这不都是很基础的东西吗,传值还是传指针,深拷贝浅拷贝我记得是大一学的
函数作为一等公民也是 js 等脚本语言广泛使用的
所以我一直觉得与其学多少新东西,先打好基础才是最重要的,很多东西大同小异,万变不离其宗
zunceng
2020-10-29 13:30:51 +08:00
leeraya
2020-10-29 13:42:02 +08:00
@hakono 太牛了,感谢大佬。
wander639
2020-10-29 13:44:37 +08:00
可以新开一贴:用 go 语言的人就很离谱

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/719724

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX