Golang インターフェースからバイト変換へ

PHPz
リリース: 2023-05-10 21:40:35
オリジナル
642 人が閲覧しました

Golang は、同時実行性とガベージ コレクション メカニズムをサポートする、Google によって開始された静的型付けプログラミング言語であり、そのシンプルさ、効率性、信頼性によりソフトウェア開発で広く好まれています。 Golang の威力はそのインターフェイス メカニズムにあり、インターフェイスを通じて抽象化、カプセル化、ポリモーフィズムなどのプログラミング技術を実現できるため、コードがより簡潔かつ柔軟になります。 Golang では、インターフェイスを自由に組み合わせて埋め込んでさまざまな複雑な型を形成できるため、コードの再利用性と効率が大幅に向上します。ただし、実際の開発では、送信と保存を容易にするために、インターフェイスをバイト配列に変換する必要がある場合があります。では、インターフェイスをバイトに変換する操作を Golang で実装するにはどうすればよいでしょうか?この記事ではこの知識を詳しく紹介します。

  1. インターフェースの定義

Golang では、インターフェースはメソッドのコレクションであり、フィールドは含まれません。インターフェイス タイプは、実装ではなく機能を定義します。具体的には、インターフェイス タイプは、インターフェイスの唯一のメンバーである 1 つ以上のメソッドを定義します。インターフェースタイプのゼロ値は nil です。インターフェイスを他のインターフェイスに埋め込んで複合インターフェイスを形成できます。

Golang のインターフェイスは弱い型指定であるため、インターフェイス変数にはインターフェイス定義に準拠する任意の型を格納できます。これが Golang のポリモーフィズムです。他のプログラミング言語とは異なり、Golang のポリモーフィズムは継承関係に依存せず、インターフェイスを通じて実装されます。したがって、インターフェイスは Golang の最も重要なメカニズムの 1 つです。

インターフェースは次のように定義されます。

type InterfaceName interface {
    Method1Name(param1 T1, param2 T2) ReturnType
    Method2Name(param1 T3, param2 T4) ReturnType
    // ...
}
ログイン後にコピー

このうち、InterfaceNameはインターフェースの名前、Method1Name、Method2Nameなどはインターフェースのメソッドリスト、T1、T2、T3です。 、T4 はパラメータの型、ReturnType はメソッドの戻り値の型です。

  1. インターフェースをバイトに変換する

Golang では、いくつかのツールを使用してインターフェースをバイトに変換できます。一般的な方法をいくつか紹介します。

2.1 エンコーディング/gob パッケージの使用

Golang 標準ライブラリのエンコーディング/gob パッケージは、Golang のデータ型をバイト配列に変換する機能を実装します。このパッケージは、さまざまな Golang データ型のバイト配列へのエンコードをサポートしており、必要に応じて対応するデータ型にデコードできます。このパッケージの GobEncoder インターフェイスと GobDecoder インターフェイスを使用して、カスタム タイプのエンコードとデコードを実装できます。

具体的な使用法は次のとおりです。

個人情報を保存するための Person 構造体を定義します。

type Person struct {
    Name string
    Age  int
}
ログイン後にコピー

パーソン変数を作成し、バイト配列に変換します。

p := Person{Name: "Eric", Age: 20}
// 创建一个 bytes.Buffer 用于存储编码后的字节流
buf := new(bytes.Buffer)
// 创建一个 gob.Encoder,将 Person 类型编码成字节流
err := gob.NewEncoder(buf).Encode(p)
if err != nil {
    fmt.Println(err)
    return
}
ログイン後にコピー

バイト配列を対応する型にデコードします。

var newP Person
// 创建一个 gob.Decoder,从字节流中解码出 Person 类型
err = gob.NewDecoder(buf).Decode(&newP)
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println(newP.Name, newP.Age)
ログイン後にコピー

エンコーディング/gob パッケージを使用して、GobEncoder および GobDecoder インターフェイスを実装するすべてのカスタム型をバイト配列に変換します。Golang の組み込み型のほとんどをバイト配列に変換することもできます。ただし、このパッケージはインターフェイス型からバイト配列への変換をサポートしていないため、インターフェイスをバイト配列に変換するために直接使用することはできません。

2.2 エンコーディング/json パッケージの使用

Golang 標準ライブラリのエンコーディング/json パッケージは、Golang での JSON エンコードおよびデコードのためのサポート パッケージです。インターフェイスをバイトに変換します。これは、一部の RESTful API で非常に実用的です。

インターフェイス タイプ MyInterface を定義し、インターフェイスを含む構造体 MyStruct を作成します。

type MyInterface interface {
    SayHello() string
}
type MyStruct struct {
    // MyInterface 隐式实现
    MyInterface
}
func (s *MyStruct) SayHello() string {
    return "Hello"
}
ログイン後にコピー

MyStruct 型を JSON バイト配列にエンコードします。

s := MyStruct{}
// 创建一个 JSON 编码器,将 MyStruct 类型编码成 JSON 字节数组
b, err := json.Marshal(s)
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println(string(b))
ログイン後にコピー

JSON バイト配列から対応する型をデコードします。

var newS MyStruct
// 创建一个 JSON 解码器,从字节数组中解码出 MyStruct 类型
err = json.Unmarshal(b, &newS)
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println(newS.SayHello())
ログイン後にコピー

encoding/json パッケージは、Marshaler および Unmarshaler インターフェイスを実装するすべてのカスタム型をバイト配列に変換でき、Golang の組み込み型のほとんどもバイト配列に変換できます。また、このパッケージはインターフェイス型からバイト配列への変換をサポートしているため、インターフェイスをバイト配列に変換するために使用できます。

2.3 Golang シリアル化フレームワークの使用

Golang には、protobuf、msgpack など、優れたシリアル化フレームワークが多数あります。これらのフレームワークは、Golang データ型をバイト配列に変換できます。これらのフレームワークは、完全なエンコードおよびデコード インターフェイスを提供し、柔軟な構成と効率的なシリアル化アルゴリズムをサポートしているため、Golang でインターフェイスをバイトに変換するのが非常に便利です。

protobuf を例として、まず protobuf メッセージ タイプを定義します。

syntax = "proto3";
package main;
message Person {
    string name = 1;
    int32 age = 2;
}
ログイン後にコピー

protoc ツールを使用して Go コードを生成します。

protoc -I=$SRC_DIR --go_out=$DST_DIR $SRC_DIR/person.proto
ログイン後にコピー

Golang で protobuf を使用する:

p := Person{Name: "Eric", Age: 20}
// 将 Person 类型编码成字节流
pbBytes, err := proto.Marshal(&p)
if err != nil {
    fmt.Println(err)
    return
}
// 将字节流解码成 Person 类型
var newP Person
err = proto.Unmarshal(pbBytes, &newP)
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println(newP.Name, newP.Age)
ログイン後にコピー

シリアル化フレームワークを使用すると、さまざまなデータ型をバイト配列に変換するのに非常に便利で、効率が高いため実用的です。開発中。

概要

この記事では、encoding/gob、encoding/json、Golang シリアル化フレームワークなど、Golang でインターフェイスをバイト配列に変換する方法を詳しく紹介し、詳しく説明します。 . この方法の使い方と注意点。さまざまなシナリオやニーズにはさまざまな方法が適しており、開発者は特定の状況に応じて適切な方法を選択できます。 Golang は静的に型付けされたプログラミング言語として、インターフェイス変換を実装する際にコードの読みやすさと保守しやすさにさらに注意を払っており、そのため Golang は多くの企業やプロジェクトで好まれるプログラミング言語の 1 つとなっています。

以上がGolang インターフェースからバイト変換への詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!