CGO プロジェクトでよく使用されるデータ変換と使用方法の詳細な説明
この記事は、golang のチュートリアル コラムから提供され、CGO の実践プロジェクトでよく使用されるデータ変換と使用方法を紹介するものです。必要!
まえがき
関連する環境をデプロイし、基本的な知識を習得する必要があります。これは一般的な科学記事ではなく、主に実際のプロジェクトで使用される種類のものです。 . 動的ライブラリの関数呼び出しパラメータ送受信のための変換と利用
1. GO 環境、CGO のサポート開始
2. 事前に g をインストール
3. GO と C## の構文を理解する#4 、主に C を自分でデバッグするときに使用する必要があるため、基本的な makefile またはシェル構文を知っておくのが最善です (つまり、私は理解できません。初心者で、大まかな概要しか読めません)。 ## すべてを知っている場合は、リテラシー リンクをクリックしてください:chai2010.cn/advanced-go-programmin...
基本データ型のリスト
##GO は C 言語の呼び出しをサポートしているため、C での変換のみがリストされていますが、C については、正常に呼び出す前に C 言語に変換する必要があります。各 C 変数は 1 つのパッケージ内での使用に制限されていることに注意してください。パッケージ間で使用したい場合は、GO を使用してカプセル化してください。そうでない場合は、呼び出しエラーが表示され、C 変数が見つかりません。プロジェクトで使用されるデータ型変換
#Go 文字列は C に変換されます
C 文字列は 1 文字です配列の場合は、簡単に言えば、0 で終わる文字配列は文字列であるため、基本データ型には属しません。 C.CString は C を呼び出す標準ライブラリです。これは新しいメモリ空間に適用され、解放するには C.free を呼び出す必要があります。そうしないとメモリ リークが発生します。 var deviceIp string
cdeviceIp := C.CString(deviceIp)
defer C.free(unsafe.Pointer(cdeviceIp))
ログイン後にコピー
var deviceIp string cdeviceIp := C.CString(deviceIp) defer C.free(unsafe.Pointer(cdeviceIp))
C の char * /char[] は go の string に変換されます
C の標準ライブラリ C.GoString を呼び出します。この関数は新しいメモリ空間を生成しません。コピーしますが、メモリ領域は解放されません。
C バイト配列を Go 文字列に変換します
たとえば、C の型は次のとおりです: BYTE sSerialNumber[SERIALNO_LEN];これを取得する方法は次のとおりです。 append を使用して文字列にバイトを追加します serialNo := make([]byte, 0)
for _, v := range sSerialNumber {
if v != 0 {
serialNo = append(serialNo, byte(v))
}
}
ログイン後にコピー
前述の文字配列と文字列の違いに注意してください。 serialNo := make([]byte, 0) for _, v := range sSerialNumber { if v != 0 { serialNo = append(serialNo, byte(v)) } }
文字列を C 文字配列に移動
Type: CHAR szKeyFilePath[PU_CERT_FILE_PATH_MAX]; var keyFilePath = "/home/docker/path/file.jpg"
for i, b := range keyFilePath {
szKeyFilePath[i] = C.CHAR(b)
}
ログイン後にコピー
var keyFilePath = "/home/docker/path/file.jpg" for i, b := range keyFilePath { szKeyFilePath[i] = C.CHAR(b) }
結合データ取得
Huawei カメラのデータ コールバックに接続すると、共用体型のデータが取得されます。通常の構造体として取得すると、コンパイラは常に構造体が見つからないことを示すメッセージを表示します。 Cコード 共用体のデータを取得後、基本データ型に変換して、再度Goを呼び出します。コード スニペットを投稿して、顔認識コールバックからデータを取得します。コンテキストは気にせず、データ型を取得する方法だけを見てください。 void CGopfFaceSnapCallBack(CHAR *szBuffer, LONG lSize, void *pUsrData) {
PU_META_DATA *pstMetaData = 0;
int ret = Wrapper_IVS_User_GetMetaData(szBuffer, lSize, TARGET, &pstMetaData);
if (ret == PU_FALSE ){
return ;
}
PU_UserData *pstMetaUserData = pstMetaData->pstMetaUserData;
char name[100]={0};
char cardID[100]={0};
for(UINT uIndex = 0; uIndex usValidNumber; ++uIndex){
//printf("pstMetaData eType : %x\n", pstMetaUserData[uIndex].eType);
if (pstMetaUserData[uIndex].eType == FACE_INFO){
strcpy(cardID, pstMetaUserData[uIndex].unMetaData.stFaceInfo.cardID);
strcpy(name, pstMetaUserData[uIndex].unMetaData.stFaceInfo.name);
printf("GopfFaceSnapCallBack unMetaData.stFaceInfo cardID : %s\n", pstMetaUserData[uIndex].unMetaData.stFaceInfo.cardID);
printf("GopfFaceSnapCallBack unMetaData.stFaceInfo name : %s\n", pstMetaUserData[uIndex].unMetaData.stFaceInfo.name);
GopfFaceSnapCallBack(pstMetaUserData[uIndex].unMetaData.stFaceInfo.cardID,pUsrData);
break ;
}
}
Wrapper_IVS_User_FreeMetaData(&pstMetaData);
return ;}
ログイン後にコピーこのコードを Go ロジックに置き換えて Go で直接読み取ると、unMetaData が定義を見つけられないというメッセージが表示されます。他に成功する読み取り方法があれば、お知らせください。
void CGopfFaceSnapCallBack(CHAR *szBuffer, LONG lSize, void *pUsrData) { PU_META_DATA *pstMetaData = 0; int ret = Wrapper_IVS_User_GetMetaData(szBuffer, lSize, TARGET, &pstMetaData); if (ret == PU_FALSE ){ return ; } PU_UserData *pstMetaUserData = pstMetaData->pstMetaUserData; char name[100]={0}; char cardID[100]={0}; for(UINT uIndex = 0; uIndex usValidNumber; ++uIndex){ //printf("pstMetaData eType : %x\n", pstMetaUserData[uIndex].eType); if (pstMetaUserData[uIndex].eType == FACE_INFO){ strcpy(cardID, pstMetaUserData[uIndex].unMetaData.stFaceInfo.cardID); strcpy(name, pstMetaUserData[uIndex].unMetaData.stFaceInfo.name); printf("GopfFaceSnapCallBack unMetaData.stFaceInfo cardID : %s\n", pstMetaUserData[uIndex].unMetaData.stFaceInfo.cardID); printf("GopfFaceSnapCallBack unMetaData.stFaceInfo name : %s\n", pstMetaUserData[uIndex].unMetaData.stFaceInfo.name); GopfFaceSnapCallBack(pstMetaUserData[uIndex].unMetaData.stFaceInfo.cardID,pUsrData); break ; } } Wrapper_IVS_User_FreeMetaData(&pstMetaData); return ;}
C
コールバック関数を C
1 で呼び出します。まず、同じデータ型の関数を Go コードに実装し、//export を使用して C 関数としてエクスポートします。コールバックが見つからない場合は、まずデータ型が正しいかどうかを確認し、次にトリガー条件が満たされているかどうかを確認します。このステップはC言語のコールバックデータ、つまりこの関数で取得したコールバック後のデータをGo言語で受け取るステップです。2. CGO は C 関数を呼び出します。一部の同僚は、このステップは省略できると言っています。最初のステップの関数を Go で直接呼び出すだけで済みます。私はまだ試していません。会社の祖先のコードは次のように書かれています。これをフォローするだけです。
3. GO 言語の共通関数として直接呼び出すだけです。
コード例を見てください:
C 関数宣言:
typedef VOID (CALLBACK *pfRealDataCallBack)(CHAR *szBuffer, LONG lSize, VOID *pUsrData);
//export GopfRealDataCallBackfunc GopfRealDataCallBack(szBuffer *C.CHAR, lSize C.LONG, pUsrData unsafe.Pointer) { fmt.Println(szBuffer,lSize,pUsrData)}
extern void GopfRealDataCallBack(CHAR *szBuffer, LONG lSize, void *pUsrData);void CGopfRealDataCallBack(CHAR *szBuffer, LONG lSize, void *pUsrData){ return GopfRealDataCallBack(szBuffer,lSize,pUsrData);}
void* および unsafe.Pointer
unsafe .Pointer は、すべてのデータ型転送ブリッジとして知られており、言語レベルで同等と見なすことができます。void* が発生した場合、unsafe.Pointer を使用して受信または送信できます。特定の型の変換には、実際の型に基づいた強制変換が必要です。例:lpOutBuff := unsafe.Pointer(C.malloc(1024))
结构体数组的传递
results := (*C.struct_name)(C.malloc(C.size_t(C.sizeof_struct_name * C.int(resLen)))) defer C.free(unsafe.Pointer(results))
struct_name换成具体的结构体名称,申请了空间要释放,GO检测不到C的部分。
结构体数组遍历获取元素数据
for i := 0; i <p>struct_name换成具体的结构体名称,uintptr是元素内存地址,根据偏移量获取元素。<code>go for i := 0; i <span class="rm-link-color"> </span> </code></p><p class="meta" style="margin: 35px 0px;"><em class="icon tags"></em></p>
以上がCGO プロジェクトでよく使用されるデータ変換と使用方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Go ではファイルを安全に読み書きすることが重要です。ガイドラインには以下が含まれます。 ファイル権限の確認 遅延を使用してファイルを閉じる ファイル パスの検証 コンテキスト タイムアウトの使用 これらのガイドラインに従うことで、データのセキュリティとアプリケーションの堅牢性が確保されます。

Go データベース接続の接続プーリングを構成するにはどうすればよいですか?データベース接続を作成するには、database/sql パッケージの DB タイプを使用します。同時接続の最大数を制御するには、MaxOpenConns を設定します。アイドル状態の接続の最大数を設定するには、ConnMaxLifetime を設定します。

Golang 単体テストでアサーションに Gomega を使用する方法 Golang 単体テストでは、Gomega は、開発者がテスト結果を簡単に検証できるように、豊富なアサーション メソッドを提供する人気のある強力なアサーション ライブラリです。 Gomegagoget-agithub.com/onsi/gomega をインストールする アサーションに Gomega を使用する アサーションに Gomega を使用する一般的な例をいくつか示します。 1. 等価アサーション import "github.com/onsi/gomega" funcTest_MyFunction(t*testing.T){

GoLang フレームワークと Go フレームワークの違いは、内部アーキテクチャと外部機能に反映されています。 GoLang フレームワークは Go 標準ライブラリに基づいてその機能を拡張していますが、Go フレームワークは特定の目的を達成するための独立したライブラリで構成されています。 GoLang フレームワークはより柔軟であり、Go フレームワークは使いやすいです。 GoLang フレームワークはパフォーマンスの点でわずかに優れており、Go フレームワークはよりスケーラブルです。ケース: gin-gonic (Go フレームワーク) は REST API の構築に使用され、Echo (GoLang フレームワーク) は Web アプリケーションの構築に使用されます。

JSON データは、gjson ライブラリまたは json.Unmarshal 関数を使用して MySQL データベースに保存できます。 gjson ライブラリは、JSON フィールドを解析するための便利なメソッドを提供します。json.Unmarshal 関数には、JSON データをアンマーシャリングするためのターゲット型ポインターが必要です。どちらの方法でも、SQL ステートメントを準備し、データをデータベースに永続化するために挿入操作を実行する必要があります。

FindStringSubmatch 関数は、正規表現に一致する最初の部分文字列を検索します。この関数は、最初の要素が一致した文字列全体で、後続の要素が個々の部分文字列である、一致する部分文字列を含むスライスを返します。コード例: regexp.FindStringSubmatch(text,pattern) は、一致する部分文字列のスライスを返します。実際のケース: 電子メール アドレスのドメイン名を照合するために使用できます。たとえば、email:="user@example.com", pattern:=@([^\s]+)$ を使用してドメイン名を照合します。 [1]。

バックエンド学習パス:フロントエンドからバックエンドへの探査の旅は、フロントエンド開発から変わるバックエンド初心者として、すでにNodeJSの基盤を持っています...

Go 言語で事前定義されたタイムゾーンを使用するには、次の手順が必要です。 「time」パッケージをインポートします。 LoadLocation 関数を使用して特定のタイム ゾーンを読み込みます。読み込まれたタイムゾーンは、Time オブジェクトの作成、時刻文字列の解析、日付と時刻の変換の実行などの操作で使用します。事前定義されたタイム ゾーン機能の適用を説明するために、異なるタイム ゾーンを使用して日付を比較します。
