第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

轉(zhuǎn)到 / Cgo - 如何訪問 C 結(jié)構(gòu)的字段?

轉(zhuǎn)到 / Cgo - 如何訪問 C 結(jié)構(gòu)的字段?

Go
慕蓋茨4494581 2022-09-19 20:54:29
我在Go中開發(fā)了一個(gè)應(yīng)用程序,用于將音頻文件從一種格式轉(zhuǎn)碼為另一種格式:我使用使用 Cgo 綁定 FFmpeg C 庫的 goav 庫:https://github.com/giorgisio/goav/戈夫圖書館; 具有一個(gè)類型定義,該定義將原始 FFmpeg 庫 C-結(jié)構(gòu) AV輸出格式轉(zhuǎn)換為:package avformattype (    OutputFormat               C.struct_AVOutputFormat)在我的代碼中,我有一個(gè)名為 的變量,該變量的類型是.outputFOutputFormatC.struct_AVOutputFormat真正的結(jié)構(gòu)有以下字段:CAVOutputFormatname, long_name, mime_type, extensions, audio_codec, video_codec, subtitle_codec,..以及許多領(lǐng)域。請(qǐng)參見: https://ffmpeg.org/doxygen/2.6/structAVOutputFormat.html我通過以下方式驗(yàn)證了情況并到達(dá):fmt.Println(outputF){0x7ffff7f23383 0x7ffff7f23907 0x7ffff7f13c33 0x7ffff7f23383 86017 61 0 128 <nil> 0x7ffff7f8cfa0 <nil> 3344 0x7ffff7e3ec10 0x7ffff7e3f410 0x7ffff7e3ecc0 <nil> 0x7ffff7e3dfc0 <nil> <nil> <nil> <nil> <nil> <nil> 0 0x7ffff7e3e070 0x7ffff7e3e020 <nil>}音頻編解碼器字段位于位置,包含586017我使用包驗(yàn)證了字段名稱:reflectval := reflect.Indirect(reflect.ValueOf(outputF))fmt.Println(val)fmt.Println("Fieldname: ", val.Type().Field(4).Name)Output:Fieldname:  audio_codec我嘗試使用以下命令訪問原始字段:audio_codecAVOutputFormatfmt.Println(outputF.audio_codec)ERROR: outputF.audio_codec undefined (cannot refer to unexported field or method audio_codec)fmt.Println(outputF._audio_codec)ERROR: outputF._audio_codec undefined (type *avformat.OutputFormat has no field or method _audio_codec)正如我在Cgo文檔中讀到的:在Go文件中,可以通過在下劃線前綴來訪問作為Go中關(guān)鍵字的C結(jié)構(gòu)字段名稱:如果x指向帶有名為“type”的字段的C結(jié)構(gòu),x._type訪問該字段。無法在 Go 結(jié)構(gòu)中表示的 C 結(jié)構(gòu)字段(如位字段或未對(duì)齊的數(shù)據(jù))在 Go 結(jié)構(gòu)中被省略,替換為適當(dāng)?shù)奶畛湟缘竭_(dá)下一個(gè)字段或結(jié)構(gòu)的末尾。但我不知道我做錯(cuò)了什么。編輯:好吧,肯定不需要下劃線,因?yàn)閍udio_codec不是Go中的關(guān)鍵字。我現(xiàn)在明白了。但是仍然存在一個(gè)問題,為什么我無法訪問CStruct字段“audio_codec”。
查看完整描述

1 回答

?
慕哥6287543

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個(gè)贊

GO / CGO有一些特質(zhì),你在這里碰到:

type OutputFormat C.struct_AVOutputFormat是 go 類型聲明,而不是別名。將其視為薄包裝而不是別名可能會(huì)有所幫助。因此,C.struct_AVOutputFormat字段不會(huì)導(dǎo)出,這就是您獲得OutputFormat != C.struct_AVOutputFormatERROR: outputF.audio_codec undefined (cannot refer to unexported field or method audio_codec)

如果該字段被調(diào)用Audio_codec它將符合go對(duì)導(dǎo)出標(biāo)識(shí)符的定義,我們可以訪問它,但事實(shí)并非如此。

有一種方法可以解決這個(gè)問題,但我建議在繼續(xù)之前三思而后行,因?yàn)樗褂貌话踩闹羔?,并且您的程序可能?huì)在運(yùn)行時(shí)失去可移植性和/或穩(wěn)定性。如果您想了解更多信息,這是不安全指針的良好介紹。

現(xiàn)在,如果您確實(shí)確定要執(zhí)行此操作,解決方案是將指針轉(zhuǎn)換為不安全的指針,然后將其轉(zhuǎn)換為指向 的指針。請(qǐng)注意,這需要您加載 FFMPEG 標(biāo)頭才能獲得OutputFormatC.struct_AVOutputFormatC.struct_AVOutputFormat

//#cgo pkg-config: libavformat

//#include <libavformat/avformat.h>

import "C"

import (

    "fmt"

    "unsafe"

    "github.com/giorgisio/goav/avformat"

)


func getOutput() *avformat.OutputFormat {

  // calls out to avformat and gets an OutputFormat back

}


func main() {

    outputF := getOutput()

    coutput := *(*C.struct_AVOutputFormat)(unsafe.Pointer(outputF))


    fmt.Println(coutput.audio_codec) // This should now work

}

警告:我還沒有測試cgo包配置和導(dǎo)入是否正確,但這適用于一個(gè)簡單的C庫,我站起來嘗試一下。<libavformat/avformat.h>


查看完整回答
反對(duì) 回復(fù) 2022-09-19
  • 1 回答
  • 0 關(guān)注
  • 154 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)