为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
森林海 2021-09-10 10:32:26
我正在 Golang 开发一个个人项目,使用libtorrent-go当我收到类型为 的警报时"save_resume_data_alert",我将其捡起并必须按照libtorrent 文档中的说明进行 CAST...        save_resume_data_alert const* rd = alert_cast<save_resume_data_alert>(a);...但我真的不知道如何在 golang 中转换它!当前代码:package mainimport (    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 {}}
查看完整描述

1 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

如上所述,libtorrent-go开发人员回答了我,因此出于后代原因,我转发了答案。


SWIG-Golang 文档中记录了使用 SWIG 库在 Golang 中转换 C++ 结构。

特别是在本声明中:


给定接口类型的值,Go 代码可以通过调用 Swigcptr 方法检索指向 C++ 类型的指针。这将返回 SwigcptrClassName 类型的值,它只是 uintptr 的名称。Go 类型转换可用于将此值转换为不同的 C++ 类型,但请注意,此转换不会进行类型检查,并且本质上等同于 reinterpret_cast。这应该仅用于非常特殊的情况,例如 C++ 将使用 dynamic_cast 的情况。


在我上面发布的那段特定代码中,以下是使其工作所必需的:


case "save_resume_data_alert":

  log.Println("Wrote Metadata!")

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

  SaveRDAlert := lt.SwigcptrSave_resume_data_alert(alert.Swigcptr())

  log.Printf("Resume Data: %#v", SaveRDAlert.GetResume_data())


查看完整回答
反对 回复 2021-09-10
  • 1 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信