今天在分析代码时候,突然想到一个事情,在使用channel时候,我看了代码,里面传递的数据时指针类型的。我当时就在考虑,这种做法会不会导致GC压力过大,然后我进行的测试发现的确会比没有指针类型的压力大点(也不是很多)。
后面我考虑想着能不能换成非指针数据,然后我突然考虑到了一个问题,我们一般接收channel数据时候,都是在一个func中处理,比如:
```
func rcv() {
for {
p := <-pc
p.A = 1
}
}```
这种方式。这里的pc传递的是非指针数据。我想了一下,也没有发生逃逸,那么问题来了:
这里的p会分配在栈上,那我的程序一直跑着,不会导致栈空间不足吗?然后还是被分配在堆上?
求解这里问题,有点没搞懂
看到一篇文章:[Golang 元素值在经过通道传递时会被复制,这个复制是浅复制](https://blog.csdn.net/wohu1104/article/details/109608608)
如果通道传递值类型,实际就是完整的复制,发送端和接收端的数据不是同一个,所以不存在逃逸。
如果传递引用类型,由于只是引用被复制,例如指针地址被传过去了,这时候就存在逃逸。
#1
更多评论
这个我知道,问题是,就我了解的,没有逃逸的数据分配在函数栈上,然后等函数结束时候,就被一起释放。但是我这个函数,是一直运行,一直接收数据,问题就是数据会一直分配在栈上,不会导致栈空间不足吗?还是我对栈这里的理解有问题。。
#2
我运行了如下代码,浏览器打开 http://127.0.0.1:4500/debug/pprof/ ,然后点击`allocs`,一直刷新页面看到`Stack =`栈分配没有增加,所以我觉得不会随着程序的运行导致栈空间占满。点击`heap`里面的`Stack =`也是没有增加的。
```go
package main
import (
"fmt"
"net/http"
_ "net/http/pprof"
"time"
)
func main() {
pc := make(chan t)
go rcv(pc)
go func() {
for {
tt := t{}
pc <- tt
time.Sleep(time.Second)
}
}()
_ = http.ListenAndServe(":4500", nil)
}
type t struct {
A int
}
func rcv(pc chan t) {
for {
p := <-pc
p.A = 1
fmt.Printf("p: %p\n", &p)
}
}
```
#3