go学習ドキュメント-構造(struct)--メソッド(method)

2874 ワード

一、構造
  • 1、構造体はJavaのメソッドのないクラスに似ています.
  • 2、構造体は , , !! !!であり、new関数により実例化することができる(参照タイプが得られる).
  • 3、構造体を構成する要素をフィールド(fields)と呼び、各フィールドにはタイプと名前があり、 .
  • 4、構造体のフィールドは、任意のタイプであってもよい.構造体自体であってもよいし、関数またはインタフェースであってもよい.
  • 5、ネストされた構造体(継承と同様)の場合、フィールドはリロード可能な
  • である.
    1、インスタンス化
    --newを使います(ポインタタイプが得られます)
    new関数を使用して、新しい構造体変数にメモリを割り当て、割り当てられたメモリへのポインタを返します:var t *T = new(T)
    type struct1 struct {
        i1  int
        f1  float32
        str string
    }
    var stru *struct1 = new(struct1)
    

    --オブジェクトの字面量の仕方(値のタイプが得られます)
    type Interval struct {
        start int
        end   int
    }
    
    intr1 := Interval{0, 3}            // __(       )__
    intr2 := Interval{end:5, start:1}  // __(       )__
    intr3 := &Interval{end:5}           // __(        )__
    

    式new(Type)と&Type{}は等価であり,得られるのはポインタである. , make ,
    2、ポインタタイプのインスタンス割り当て
     pers2 := new(Person)
     pers2.lastName = "Woodward"
     (*pers2).lastName = "Woodward"  //       
    

    3、匿名(またはインライン)フィールド
    匿名フィールド:フィールドには名前がなくてもよいが、タイプは必須であり、タイプがフィールドの名前である.匿名フィールド自体は、構造体であってもよい.
    type struct01 struct { a,b int }
    type struct02 struct { 
      struct01   //      
      a int //    struct01    a   
      int  //     ,         
    }
    #    :
    str02 := new struct02()
    str02.struct01.a = 123
    str02.a = 1
    str02.int = 2   //         
    str02.b = 3
    

    二、方法
  • 1,Goにはthisの概念はなく,方法は (receiver)を介してタイプに関連付けられている.
  • 2、受信者は (Goは自動的に となり、対応する値として解釈される)でも でもよいし、参照タイプ(メモリを節約し、速度が速い)
  • を推奨する.
  • 2、メソッドはタイプと同じファイルにないことができますが、同じパッケージにある必要があります.
  • 3、タイプ+メソッドは、 の概念に結合される.
  • 4、同じ受信者タイプに重複名を付けない方法.
  • #     :
    func (recv receiver_type) methodName(parameter_list) (return_value_list) { ... }
    
    #   :
    type struct01 struct { a, b int }   //         
    //           ,       sum 
    func (stru01 *struct01) sum() int {
      // stru01     this    
      return stru01.a + stru01.b
    }
    
    func (_ *struct01) saySth() {
      fmt.Println('           struct01      ,             _    ')
    }
    
    に定義された方法は、ポインタが参照を解くため、 によって呼び出されてもよいし、 によって呼び出されてもよい. に定義されたメソッドは、 でのみ呼び出され、値では呼び出されません.
    三、構造体の遍歴
    package main
    import (
        "fmt"
        "reflect"
    )
    type person struct {
        name string
        age  int
    }
    func main() {
        v := reflect.ValueOf(person{"Diana", 30})
        count := v.NumField()
        for i := 0; i < count; i++ {
            f := v.Field(i)
            switch f.Kind() {
            case reflect.String:
                fmt.Println(f.String())
            case reflect.Int:
                fmt.Println(f.Int())
            }
        }
    }