我正在使用libtorrent-go
在Golang开发个人项目当我收到"save_resume_data_alert"
类型的提醒时,我会接听它并按照libtorrent documentation
...
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 {}
}
答案 0 :(得分:1)
如上所述,libtorrent-go
开发人员回答了我,所以我是出于后人的原因转发答案。
在SWIG-Golang documentation中记录了使用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())