登录
首页 >  Golang >  Go问答

从容器中删除玩家结构后如何从内存中删除它

来源:stackoverflow

时间:2024-04-12 20:18:30 148浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《从容器中删除玩家结构后如何从内存中删除它》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

如何从内存中删除一个结构并且根本不调用它?我需要当我从列表中删除它时,它也会从内存中清除并且循环停止,但它不会停止。告诉我如何正确地做,先谢谢你。

type Player struct {
    PlayerID int
}

func (p Player) Create() *Player {
    fmt.Println("Create Player:", p.PlayerID)

    go func() {
        for {
            println("test")
            time.Sleep(time.Second * 2)
        }
    }()

    return &p
}

func main() {

    playersList := list.New()
    playersList.PushFront(Player{PlayerID: 1}.Create())

    for e := playersList.Front(); e != nil; e = e.Next() {
        println("Remove Player:", e.Value.(*Player).PlayerID)
        playersList.Remove(e)
        e.Value = nil
        runtime.GC()
    }

    fmt.Scanf("h")
}

[日志] 创建玩家:1 移除玩家:1 测试 测试。 测试...


正确答案


你不能,或者至少你需要手动编写退出策略。当您使用 go 关键字创建 Goroutine 时,它​​将在内存中分配一个堆栈,并且该堆栈中的任何内容都被视为根对象,因此不会被垃圾收集。只有当 goroutine 完成时它才会被释放。如果 goroutine A 创建了 goroutine B,并且 goroutine A 完成了,它不会自动停止 goroutine B。唯一可以停止 goroutine B 的是 goroutine B 本身,可以通过完成 goroutine 或恐慌。虽然,你可以使用channel从goroutine A向goroutine B发送消息,告诉goroutine B停止执行,但是停止goroutine B的逻辑应该在goroutine B内部处理。

在您的情况下,如果您想在删除 Player 时停止 goroutine,您需要手动执行此操作。一种方法是您可以使用频道。每个Player都可以维护一个频道,当您从列表中删除它时,关闭该频道。然后,在 goroutine 内的 for 循环中,您需要检查通道是否未关闭,并在通道关闭时从循环中中断。像这样的:https://play.golang.com/p/7wnAO2Xa9PL

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《从容器中删除玩家结构后如何从内存中删除它》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>