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

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

尚
転載
2019-11-29 15:36:252720ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。