小编syo*_*jyo的帖子

golang为什么无法在主线程上向channel传值

情况1

package main

func main()  {
    dogChan := make(chan int)
    dogChan <- 1
}
Run Code Online (Sandbox Code Playgroud)
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.main()
    /Users/xuzhongwei/Source/awesomeProject/main.go:5 +0x50
Run Code Online (Sandbox Code Playgroud)

案例2

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.main()
    /Users/xuzhongwei/Source/awesomeProject/main.go:5 +0x50
Run Code Online (Sandbox Code Playgroud)
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.main()
    /Users/xuzhongwei/Source/awesomeProject/main.go:9 +0x72
Run Code Online (Sandbox Code Playgroud)

案例3

package main

func main()  {
    dogChan := make(chan int)

    go func(ch chan int) {
        
    }(dogChan)
    dogChan <- 1
} …
Run Code Online (Sandbox Code Playgroud)

go goroutine

3
推荐指数
1
解决办法
1023
查看次数

当 len 改变时,切片会分配新的内存空间吗?

package main

import "fmt"

func main() {
    arr := make([]int,3,4)
    fmt.Println(fmt.Sprintf("before len:%d,cap:%d, address:%p",len(arr), cap(arr), &arr))
    arr = arr[1:2]
    fmt.Println(fmt.Sprintf("after len:%d,cap:%d, address:%p",len(arr), cap(arr), &arr))
}

Run Code Online (Sandbox Code Playgroud)
before len:3,cap:4, address:0xc0000a6020
after len:1,cap:3, address:0xc0000a6020
Run Code Online (Sandbox Code Playgroud)

切片前后的地址是一样的。

我的问题是,当它的 len 从 3 更改为 1 时,切片是否会分配新的内存。

因为 slice 有三个元素, Data uintptr, Len int, Cap int 如果其中一个发生变化,我的猜测是内存上会生成一个新的 slice,是真的吗?

memory pointers go slice

-3
推荐指数
1
解决办法
40
查看次数

标签 统计

go ×2

goroutine ×1

memory ×1

pointers ×1

slice ×1