Golang Go语言就很离谱

发布于 1周前 作者 htzhanglong 来自 Go语言

Golang Go语言就很离谱

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

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

65 回复

是不是指针的问题,导致被最后一个覆盖了

更多关于Golang Go语言就很离谱的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你是怎么生成的,上代码

为什么要这样问问题…… 标题引战,正文又不上代码。

你要保存函数指针啊

感觉 lz 这样搞,很可能是自己的问题。。。。

鱼 好大的鱼 虎纹鲨鱼

若不是你自己的问题,我吃屎

应该是 go 的经典问题,循环的时候传指针了

例如:
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 数组,元素都是一样的

你这是循环的时候错误的使用了指针吧

for index, name1 := range xxx {
index, name1 := index, name1
// the rest code…
}

看了 LZ 的代码原来是这么回事,问题不在闭包,而是 for index, name1 := range nameArr{} 中, 每次循环都是在重复利用 name1 为 name1 赋不同的值 ,name1 本身的值在不停变换
闭包中引用同一个变量的话,那必定是闭包的里变量的值都一样的

https://studygolang.com/articles/14696

<br><br> for index := range nameArr {<br> tmpName := nameArr[index]<br> test[index] = func(name string) string {<br> fmt.Println("hello " + name + tmpName + strconv.Itoa(index))<br> return "hello " + name + tmpName + strconv.Itoa(index)<br> }<br><br> }<br>
改成这样就行了

都忘了 V2EX 不能回复 Markdown 了
例子: https://play.golang.org/p/4qyRFCv2AMF

关于 for range 这个, 我一般是不太喜欢使用 for idx, value := slice1 的写法的, 因为 value 是指的拷贝,每次循环都要拷贝一遍,大量循环的时候性能会有影响,所以默认都是 for idx := slice1 这样

这不都是很基础的东西吗,传值还是传指针,深拷贝浅拷贝我记得是大一学的
函数作为一等公民也是 js 等脚本语言广泛使用的
所以我一直觉得与其学多少新东西,先打好基础才是最重要的,很多东西大同小异,万变不离其宗

太牛了,感谢大佬。

可以新开一贴:用 go 语言的人就很离谱

这么基础的问题,怪 go 语言就离谱

// 自己细品
for index, name1 := range nameArr {
test[index] = func(i int, name1 string) Greeting {
return func(name string) string {
fmt.Println("hello " + name + name1 + strconv.Itoa(i))
return "hello " + name + name1 + strconv.Itoa(i)
}
}(index, name1)
}

??? 这问题还能怪 Go 啊?

忘加狗头了

一个帖子多重反转。
看标题我就知道要引战了。
看内容没想到连代码都没贴就开始提问题了,得学习下「如何提问」
看了贴出来的代码,没想到是一个很基础的问题,得学习下「 The Go Programming Language 」。

但凡认真学习下也不会踩这个坑: https://book.douban.com/subject/27044219/ 书里说的很明白。

最后,其实是楼主标题党了。

去面试这样子笔试都过不了的

javascript 这有类似的问题

这贴是对 Cunningham’s Law 的伟大实践(手动狗头

#14 但是为什么 test 内部三个函数的地址却还是一样的呢

你这不是 go 的问题吧,这是对编程里边的 for 循环有异议?

怪我,不用说了

新手上路基本都会碰到这个坑,特别是从 PHP 转过来的,趟坑多了,慢慢体会,我已经趟了一路了。

看了一遍,又浪费时间了

涉及到底层所以不是非常了解,但从理解上来说,闭包调用的时候函数定义和环境是分开的,所以环境虽然不同,但是指向的都是同一个地址

我觉得应该算是一种编译器优化。

函数地址肯定都是一样的呀,了解一下 linux 进程内存模型,函数都在代码段里。

编码时候看起来是函数是个变量,实际上只有一个函数的代码段,函数内的变量实际上是参数。

这个坑就离谱

基础差不要紧,请用 https://github.com/kyoh86/scopelint 检查 range 的写法。

这个贴就很离谱

V 站的提问质量每况愈下

但是楼主成功了

这个坑还常见的,以前写过一篇博客: https://www.sulinehk.com/post/golang-closure-details/

不要老是想着搞一个大新闻~

天天 Go 语言离谱,JS 离谱的,来写 C++ 嘛,求求你们来写 C++ 嘛,赚得还更多,为啥不来写捏

这不是和在一个循环里面把一个对象属性改改放进去 list,然后发现整个 list 里面的对象属性全都和最后一个一样一回事嘛。

C 艹在他们手里就更离谱了🐶

函数返回有类型很奇怪吗?
————-
PHP 就很离谱
Python 就很离谱
JS 就很离谱
Lua 就很离谱
Lisp 就很离谱
C 就很离谱
C++就很离谱
Java 就很离谱
GO 就很离谱

————-
计算机就是离谱
人类就是离谱
地球就是离谱
银河系就是离谱
宇宙就是离谱
大爆炸就是离谱

这不就是 js 经典闭包问题吗?

博客样式很好看

楼主就很离谱

楼主就很离谱

一定要先学好基础

很遗憾看不到 7 楼吃屎

楼主就很离谱

楼主就很离谱

楼主就很离谱

楼主就很离谱

楼主就很离谱

楼主就很离谱

楼主就很离谱

你们不对劲

任何函数是 first-class, closure 是 deep binding 的都有这种现象,不是 go 特有的
这楼主不懂乱喷

指针 指针 !!!!引用!!!引用

关于您提到的“Golang Go语言就很离谱”这一观点,我作为一名IT领域的Go语言专家,想从专业角度分享一些看法。

首先,Golang(又称Go语言)是由Google开发的一种编程语言,它以其简洁、高效和并发处理能力强的特点而受到广泛赞誉。Go语言的设计哲学强调简洁性和可读性,使得代码易于编写、理解和维护。

其次,Go语言在并发编程方面表现出色。它内置的goroutine和channel机制使得并发编程变得简单而高效,非常适合处理高并发、高吞吐量的应用场景。

此外,Go语言还拥有强大的标准库和生态系统。标准库涵盖了网络编程、文件操作、文本处理等多个方面,而生态系统则提供了丰富的第三方库和工具,进一步扩展了Go语言的应用范围。

当然,任何编程语言都有其局限性和不足之处。Go语言也不例外,它可能在某些特定领域或场景下不如其他语言灵活或强大。但是,这并不意味着Go语言就是“离谱”的。相反,它作为一种新兴的主流编程语言,已经在众多领域取得了显著的成果和广泛的应用。

因此,我认为对于Go语言的评价应该客观、全面。它既有优点也有不足,但总体来说是一种非常值得学习和使用的编程语言。如果您对Go语言感兴趣或想了解更多相关信息,欢迎随时与我交流。

回到顶部