使用 Golang 绑定在 libtorrent 中投射“警报”类型

我正在 Golang 开发一个个人项目,使用libtorrent-go


当我收到类型为 的警报时"save_resume_data_alert",我将其捡起并必须按照libtorrent 文档中的说明进行 CAST


...

        save_resume_data_alert const* rd = alert_cast<save_resume_data_alert>(a);

...

但我真的不知道如何在 golang 中转换它!当前代码:


package main


import (

    lt "github.com/steeve/libtorrent-go"


    "log"

    "time"

)


func main() {


    randomTorrent := lt.NewAdd_torrent_params()

    randomTorrent.SetUrl("PUT A MAGNET LINK HERE")

    randomTorrent.SetSave_path(".")


    ec := lt.NewError_code()

    torrentSession := lt.NewSession()

    torrentSession.Set_alert_mask(status_notification + storage_notification)

    torrentSession.Listen_on(lt.NewStd_pair_int_int(6900, 6999), ec)

    if ec.Value() != 0 {

        log.Println(ec.Message())

    }


    torrentHandle := torrentSession.Add_torrent(randomTorrent, ec)

    if ec.Value() != 0 {

        log.Println(ec.Message())

    }


    go func() {

        for {

            if torrentSession.Wait_for_alert(lt.Seconds(10)).Swigcptr() == 0 {

                log.Println("Alert timeout occurred!")

            }


            alert := torrentSession.Pop_alert()

            switch alert.What() {

            default:

                log.Printf("Alert: %#v", alert.What())

            case "metadata_received_alert":

                log.Println("Received Metadata!! finally!")

                torrentHandle.Save_resume_data()

            case "save_resume_data_alert":

                log.Println("Wrote Metadata!")

                // need to actually write the resume_data :( can't find how

            case "save_resume_data_failed_alert":

                log.Println("Failed Metadata!")

            }

        }

    }()


    select {}

}



森林海
浏览 200回答 1
1回答

PIPIONE

如上所述,libtorrent-go开发人员回答了我,因此出于后代原因,我转发了答案。SWIG-Golang 文档中记录了使用 SWIG 库在 Golang 中转换 C++ 结构。特别是在本声明中:给定接口类型的值,Go 代码可以通过调用 Swigcptr 方法检索指向 C++ 类型的指针。这将返回 SwigcptrClassName 类型的值,它只是 uintptr 的名称。Go 类型转换可用于将此值转换为不同的 C++ 类型,但请注意,此转换不会进行类型检查,并且本质上等同于 reinterpret_cast。这应该仅用于非常特殊的情况,例如 C++ 将使用 dynamic_cast 的情况。在我上面发布的那段特定代码中,以下是使其工作所必需的:case "save_resume_data_alert":&nbsp; log.Println("Wrote Metadata!")&nbsp; // need to actually write the resume_data :( can't find how&nbsp; SaveRDAlert := lt.SwigcptrSave_resume_data_alert(alert.Swigcptr())&nbsp; log.Printf("Resume Data: %#v", SaveRDAlert.GetResume_data())
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go