ホームページ  >  記事  >  バックエンド開発  >  golangインターフェース転送

golangインターフェース転送

WBOY
WBOYオリジナル
2023-05-19 10:08:07458ブラウズ

型の実装原則

静的型付け言語として、Golang は非常に強力な機能であるインターフェイスを提供します。これは、開発者がコードの再利用性を実現するのに役立つだけでなく、コード構造を破壊することなくプログラムの機能を拡張することもできます。

Golang では、インターフェイスは型ですが、他の型とは異なり、インターフェイス型には、これらのメソッドを実装せずに一連のメソッド宣言を含めることができます。これにより、大きな柔軟性が得られます。インターフェース型を定義することで、一般的なメソッド呼び出しメソッドを定義できます。この呼び出しメソッドはインターフェース型に関連付けられており、実装型とは何の関係もありません。

それでは、インターフェース型を使用するとき、Golang はどのようにしてそれを実装型に変換するのでしょうか?この基本的な実装原理を理解する前に、まず Golang の型とインターフェイス型の基本概念を理解しましょう。

Golang の型とインターフェイス型

Golang の型は、値型と参照型の 2 つのカテゴリに分類できます。

  • 値の型:数値型、bool型、配列型、構造体型など。
  • 参照型: ポインター型、スライス型、マップ型、chan 型など。

値型は変数がメモリに直接格納されることを示し、参照型は変数がメモリ内の他のオブジェクトへのポインタを格納することを示します。値型の場合は直接比較できますが、参照型の場合は等価関数を使用して比較を行う必要があります。

Golang では、インターフェース型を使用してすべての型を表すことができます。インターフェイスは、あらゆるタイプのデータ値を表現できるため、非常に柔軟なタイプです。インターフェイス値には、インターフェイスの値を実装する任意のデータを格納できます。したがって、インターフェイス タイプを使用すると、特定のオブジェクト タイプを知らなくても、任意のタイプのデータを関数に渡したり、オブジェクト データを保存したりできます。

型とインターフェース型の関係

Golang では、型は 1 つ以上のインターフェースを実装できます。インターフェイス内のすべてのメソッドを実装する型は、インターフェイスのインスタンス化とみなされます。この型は、このインターフェイスを実装する変数の型として使用できます。

たとえば、Shaper というインターフェイス タイプがあり、これには Area() というメソッドがあります。

type Shaper インターフェイス {

Area() float64

}

Shaper インターフェイスの Area() メソッドを実装するように Square 型を作成できます。

type Square struct {

side float64

}

func (s *Square ) Area() float64 {

return s.side * s.side

}

このようにして、Square 型を Shaper 型のインスタンスにすることができます。 Square タイプの面積を計算したい場合は、Shaper タイプの Area() メソッドを使用して面積値を取得できます。

func main() {

square := &Square{10.0}
fmt.Println("Area of square:", square.Area())

}

ここでは、Square 型が Shaper 型の Area() メソッドを実装しているため、Shaper 型のインスタンスとして使用できることがわかります。インターフェイス タイプは、さまざまなタイプの面積を計算するための一般的な Area() メソッドを提供できます。この Area() メソッドの実装は実装タイプによって決まります。

なぜ型アサーションが必要なのでしょうか?

型とインターフェイス型の基本を理解したところで、Golang がインターフェイス型を実装型に変換する方法を見てみましょう。

インターフェイス タイプの変数を作成すると、実際には、メソッド テーブルへのポインタ (メソッド テーブル、仮想テーブルまたは Vtable とも呼ばれます) と実装ポインタへのポインタの 2 つの部分を含むデータ構造になります。このインターフェースの値に。メソッド テーブルはすべてのメソッド関数ポインターのリストであり、各ポインターはメソッド名とタイプに関連付けられています。

インターフェイス タイプのメソッドを呼び出すと、Golang はまずそのメソッドがメソッド テーブルにあるかどうかを確認し、次に対応するメソッドを呼び出します。通常、Golang はインターフェイス型を実装するためにポインター レシーバーを使用します。これは、このメソッドが値レシーバーよりも効率的であり、呼び出し元が値型のフィールドを変更できないようにするためです。

しかし、インターフェイス型を使用するときに、それを実装型に変換する必要がある場合があり、このとき、型アサーションを使用する必要があります。型アサーションとは、インタフェースの型が対象の型を実装しているかどうかを判断して、型変換が可能かどうかを判断する操作です。判定が成功した場合、型アサーションはターゲットの型を表す値を返します。そうでない場合は、値 0 を返し、例外をスローします。したがって、型アサーションを行う前に、型アサーションの 2 番目の戻り値を使用して、例外を防ぐための安全な判断を行う必要があります。

次のコードは、インターフェイス型を実装型に変換する方法を示しています。

func main() {

var shaper Shaper
square := &Square{10.0}
shaper = square                //将square类型转换成Shaper类型
s := shaper.(*Square)          //将shaper类型转换成Square类型
fmt.Println("Square side length:", s.side)

}

ここでは、代入することで、 Square 型の値を Shaper 型の変数に変換するには、Square 型を Shaper 型に変換します。元に変換する必要がある場合は、型アサーションを使用して Shaper 型を Square 型に変換できます。

要約

インターフェイス タイプは Golang の非常に重要な概念であり、コードの再利用性とスケーラビリティを向上させることができます。 Golang では、インターフェイス型と型アサーションを利用して、インターフェイス型を実装型に変換できます。型アサーションにより柔軟性が高まりますが、例外を避けるために、使用中に型変換の安全性に注意を払う必要があります。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。