ホームページ バックエンド開発 Golang Go言語の構造を詳しく解説

Go言語の構造を詳しく解説

Nov 29, 2019 pm 03:36 PM
言語を移動

Go言語の構造を詳しく解説

定義: これは集約データ型であり、任意の型の 0 個以上の値から集約されたエンティティです。

メンバー: 各値は構造体のメンバーと呼ばれます。

例:

典型的な構造例を使用して、会社の従業員情報を処理します。各従業員情報には、一意の従業員番号、従業員の名前、自宅住所、生年月日、役職、給与が含まれます。 、優れたリーダーシップなど。これらすべての情報はエンティティにバインドする必要があり、ユニット全体としてコピーしたり、パラメータや関数の戻り値として使用したり、配列に格納したりすることができます。

#構造の定義:

type Employee struct {
    ID        int
    Name      string
    Address   string
    DoB       time.Time
    Position  string
    Salary    int
    ManagerID int
}
ログイン後にコピー

変数の定義:

var dilbert Employee
ログイン後にコピー

メンバーへのアクセス:

dilbert.Salary -= 5000
ログイン後にコピー

メンバーアドレスの取得:

position := &dilbert.Position
*position = "Senior " + *position
ログイン後にコピー

ドット演算子と構造体へのポインタ:

var employeeOfTheMonth *Employee = &dilbert
employeeOfTheMonth.Position += " (proactive team player)"
ログイン後にコピー

メンバー定義の順序:

通常、1 行は 1 つの構造体メンバーに対応し、メンバーの名前が最初に、型が最後に来ます。ただし、隣接するメンバーの型が同じ場合は、名前と型と同様に、1 行にマージできます。以下のメンバーにアドレス指定します

type Employee struct {
    ID            int
    Name, Address string
    DoB           time.Time
    Position      string
    Salary        int
    ManagerID     int
}
ログイン後にコピー

メンバー命名規則:

構造体のメンバー名が大文字で始まる場合、メンバーはエクスポートされます。これは Go 言語によって決定されます。輸出ルール。構造体には、エクスポートされたメンバーとエクスポートされていないメンバーの両方が含まれる場合があります。

エクスポートの意味: 他のパッケージで読み書きできます。

S という名前の構造体型には、S 型のメンバーは含まれなくなります。これは、集計値にそれ自体を含めることができないためです。 (この制限は配列にも適用されます。) ただし、S 型の構造体には *S ポインター型のメンバーを含めることができるため、リンク リストやツリー構造などの再帰的なデータ構造を作成できます。

type tree struct {
    value       int
    left, right *tree
}
ログイン後にコピー

構造体の値:

各メンバーの値を指定できます。

type Point struct{ X, Y int }
p := Point{1, 2}
ログイン後にコピー

上記は最初の書き方で、構造体メンバーの定義順に各構造体メンバーの額面を指定する必要があります。

anim := gif.GIF{LoopCount: nframes}
ログイン後にコピー

メンバー名と対応する値で初期化します。これには、一部またはすべてのメンバーを含めることができます。この形式の構造体額面の書き込みでは、メンバーが省略された場合、デフォルトでゼロ値が設定されます。メンバーの名前が提供されているため、メンバー全員が登場する順序は重要ではありません。

注: 2 つの異なる記述形式を混合することはできません。

構造の埋め込みと匿名メンバー:

type Point struct {
    X, Y int
}

type Circle struct {
    Center Point
    Radius int
}

type Wheel struct {
    Circle Circle
    Spokes int
}
ログイン後にコピー

各メンバーへのアクセス:

var w Wheel
w.Circle.Center.X = 8
w.Circle.Center.Y = 8
w.Circle.Radius = 5
w.Spokes = 20
ログイン後にコピー

簡素化された構造定義:

type Circle struct {
    Point
    Radius int
}

type Wheel struct {
    Circle
    Spokes int
}
ログイン後にコピー

自慢の匿名埋め込み機能にアクセスできます。フルパスを指定せずに直接リーフ属性を指定します:

var w Wheel
w.X = 8            // equivalent to w.Circle.Point.X = 8
w.Y = 8            // equivalent to w.Circle.Point.Y = 8
w.Radius = 5       // equivalent to w.Circle.Radius = 5
w.Spokes = 20
ログイン後にコピー

構造リテラルは、形状タイプが宣言されるときに構造に従う必要があるため、次の 2 つの構文のみを使用できます。これらは相互に排他的で同等です:

w = Wheel{Circle{Point{8, 8}, 5}, 20}

w = Wheel{
    Circle: Circle{
        Point:  Point{X: 8, Y: 8},
        Radius: 5,
    },
    Spokes: 20, // NOTE: trailing comma necessary here (and at Radius)
}
ログイン後にコピー

構造体タグ:

構造体宣言では、 Year メンバーと Color メンバーの後の文字列の額面が、次のように構造体メンバー Tag

type Movie struct {
    Title  string
    Year   int  `json:"released"`
    Color  bool `json:"color,omitempty"`
    Actors []string
}

var movies = []Movie{
    {Title: "Casablanca", Year: 1942, Color: false,
        Actors: []string{"Humphrey Bogart", "Ingrid Bergman"}},
    {Title: "Cool Hand Luke", Year: 1967, Color: true,
        Actors: []string{"Paul Newman"}},
    {Title: "Bullitt", Year: 1968, Color: true,
        Actors: []string{"Steve McQueen", "Jacqueline Bisset"}},
    // ...
}
ログイン後にコピー

になります。 データ構造は、 JSON 形式なので、両者間の変換は簡単です。 Go 言語の映画に似た構造であるスライスを JSON に変換するプロセスは、マーシャリングと呼ばれます。マーシャリングは、json.Marshal 関数を呼び出すことによって行われます:

data, err := json.Marshal(movies)
if err != nil {
    log.Fatalf("JSON marshaling failed: %s", err)
}
fmt.Printf("%s\n", data)
ログイン後にコピー

Marshal 関数は、空白インデントのない長い文字列を含むエンコードされたバイト スライスを返します。これを表示用にラップします:

[{"Title":"Casablanca","released":1942,"Actors":["Humphrey Bogart","Ingr
id Bergman"]},{"Title":"Cool Hand Luke","released":1967,"color":true,"Ac
tors":["Paul Newman"]},{"Title":"Bullitt","released":1968,"color":true,"
Actors":["Steve McQueen","Jacqueline Bisset"]}]
ログイン後にコピー

, 年のメンバー名はエンコード後に解放されるようになり、カラーメンバーはエンコード後に小文字で始まる色になりました。これは、配座メンバ Tag によって引き起こされます。構造体のメンバー Tag は、コンパイル段階でメンバーに関連付けられたメタ情報の文字列です:

Year  int  `json:"released"`
Color bool `json:"color,omitempty"`
ログイン後にコピー

構造体のメンバー Tag には任意の文字列リテラル値を指定できますが、通常はスペースで区切られた一連のキーです。キーと値のペアの「value」シーケンス。値には二重引用符が含まれるため、メンバー タグは通常、ネイティブ文字列リテラルの形式で記述されます。

go 言語の知識について詳しくは、

go 言語チュートリアル 列に注目してください。

以上がGo言語の構造を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Apr 02, 2025 pm 02:03 PM

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? Apr 02, 2025 pm 04:12 PM

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Apr 02, 2025 pm 04:54 PM

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Apr 02, 2025 pm 05:09 PM

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? Apr 02, 2025 pm 12:57 PM

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? Apr 02, 2025 pm 04:00 PM

ポインター構文とviperライブラリの使用における問題への取り組みGO言語でプログラミングするとき、特にポインターの構文と使用を理解することが重要です...

See all articles