我正在 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())
- 1 回答
- 0 关注
- 198 浏览
添加回答
举报
0/150
提交
取消