我正在 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 關注
- 214 瀏覽
添加回答
舉報
0/150
提交
取消