是谁说的go语言好?因为协程泄漏搞到现在。

目前整个人都麻了。
不过精神状态还算稳定。
goroutine 这玩意,之前各种教程都在鼓吹,轻量级,简单。说这话的人他多半没写过。
首先写法上,就特别反人类。

  • 不按顺序执行
  • 嵌套地狱
  • 奇怪的语法糖

我们来看下面的例子:

func process(depth, tasks int, wg *sync.WaitGroup, results chan<- int) {
	defer wg.Done()

	if depth == 0 {
		for i := 0; i < tasks; i++ {
			results <- doWork(i, depth)
		}
		return
	}

	subResults := make(chan int, tasks)
	var subWg sync.WaitGroup

	for i := 0; i < tasks; i++ {
		subWg.Add(1)
		go process(depth-1, tasks, &subWg, subResults)
	}

	go func() {
		subWg.Wait()
		close(subResults)
	}()

	total := 0
	for result := range subResults {
		total += result
	}

	results <- total
}

func main() {
	rand.Seed(time.Now().UnixNano())
	depth := 3  
	tasksPerLevel := 3 

	results := make(chan int)
	var wg sync.WaitGroup

	wg.Add(1)
	go process(depth, tasksPerLevel, &wg, results)

	go func() {
		wg.Wait()
		close(results)
	}()

	finalTotal := 0
	for result := range results {
		finalTotal += result
	}
	fmt.Printf("Final aggregated result: %d\n", finalTotal)
}

看完以后整个人还好吧?
样板代码一大片,只能依赖大模型来打草稿。但是,当你一不小心,遇到管道,网络连接的场景,很容易就出现,你的函数执行完了,协程还在,还去继续访问已经关闭的资源。而且很难定位到问题。
今天就吐槽到这里,目前工作语言变成了go,改日继续吐槽。

152 个赞

大佬辛苦了!

6 个赞

大道智减
lz还得多学学 :sweat_smile:
试用过一段go,那会连generic都没有…代码格式还定的死死的.
不适合我这种

16 个赞

:joy::joy::joy::joy:
其实样板代码丢给大模型来写,还好。
就是一些不明确的,奇奇怪怪的东西头疼。
当然,阅读代码时候,要屏蔽一切洁癖。

1 个赞

go是不是没有宏…
那样板代码写不了一点…

7 个赞

有反射,有点像注释的样子。
话说我每次看到 rust 的宏,都要惊呼牛逼。

2 个赞

老实说go的代码我看着一直感觉反人类,还是喜欢java、C#这类风格的

6 个赞

反射运行时比不了编译期宏的一根,
所以我jvm上只用scala
非jvm用rust…

9 个赞

而且go的一些工具库都年久失修 :joy:但是又确实快,主要是交叉编译,不得不用

3 个赞

写 rust,scala 的大佬。
Java 又是另一个毒瘤。

3 个赞

想知道是哪些?

1 个赞

分词,yaml,还有几个小的没印象了,最后都用python写了 :joy:

3 个赞

不会就别写了,都是权衡,没啥完美的。并发模型多着呢,换成kt那套啥都能手动管的你指不定喜欢

2 个赞

哈哈这时候来推荐rust最合适了 :sunglasses:

1 个赞

不说别的,绝大部分语言一旦牵扯到并发执行,默认都没有顺序保证,必须要自行处理。
说白了,又想并发执行,又想要严格顺序保证,本就是冲突的。最终实现,一定会偏向某一方。

8 个赞

用习惯了就慢慢变成go的形状了

4 个赞

好像github很多万星项目 frp gost xray 都是go语言吧,在2016年mt7620路由跑预编译文件都很稳定

1 个赞

GO 还不算奔溃,试试RUST,令你心情舒畅

3 个赞

:tieba_025:毕竟Google做的东西,很少有好用的

这个程序我硬生生没看懂

2 个赞