Golang初級シリーズチュートリアル-struct


Golang初級シリーズチュートリアル-structGo対象言語ですか
対象思想を受け入れたユーザに対しては,まず,Goclassキーワードがないことを宣言する必要がある.キーワードstructは集大成者です.JavaC#C++およびその他の言語では、structがサポートされています.サポートstructには、メソッドが含まれています.Goもサポートされており、より多くの機能が提供されています.
いくつかのオブジェクト向け言語では、方法はclassまたはstructに存在し、Goにはstructのみが存在する.Java部分コード
class House {
    public String getHouseName() {  //method defined within class
        //implementation
    }
}
Go部分コード
type House struct { }

func (h House) GetHouseName() string { } //method defined outside of struct, but works on House
Goにはオブジェクト向けの概念はないが、structのいくつかの特性により、類似の機能特性も実現できる.構造体は、キーワードtypeおよびstructによって定義される.
type my_struct_name struct { }

type Rectangle struct { }

type Vehicle struct { }

type Vehicle1_Car struct { }

上記の定義は、Go変数定義のルールに合致し、有効な文です.次のいくつかは正しくありません.
type Hash# struct {} //cannot have special characters
type 0struct struct {} //cannot start with a number

また、構造体には、他のデータが含まれていてもよい.したがって、クラスと同様に、表示したいデータを構造体に定義して、メモリ内の構造体の格納領域を配置することができます.以下はいくつかの正しい例です.
type my_struct_name struct {
    i int
    j int
    s string
}

type Rectangle struct {
    length, width int //you can define multiple items of the same type on the same line separated by commas
    area float64
}

これで、上記で定義したRectangleを使用して、そのプロパティにアクセスできます.
package main

import "fmt"

type Rectangle struct {
    length, width int
}

func main() {
    r := Rectangle{}  
    fmt.Println("Default rectangle is: ", r) //print default zero-ed value
}
Default rectangle is: {0 0}

以上の出力から、構造体の変数が初期化されていない場合、自動的にzero-valueに割り当てられ、すなわちintタイプが0に割り当てられ、stringタイプが""に割り当てられることがわかる.したがって、構造体については、そのzero-valueはその内部属性によって決定される.
以下の例では、構造体の内部属性を異なる方法で初期化し、標準出力に印刷することを示す.
package main

import "fmt"

type Rectangle struct {
    length, width int
    name string
}

func main() {
    r1 := Rectangle{2, 1, "my_r1"} //initialize values in order they are defined in struct
    fmt.Println("Rectangle r1 is: ", r1)

    r2 := Rectangle{width:3, name:"my_r2", length:4} //initialize values by variable name in any order
    fmt.Println("Rectangle r2 is: ", r2)

    pr := new (Rectangle) //get pointer to an instance with new keyword
    (*pr).width = 6 //set value using . notation by dereferencing pointer.  
    pr.length = 8 //set value using . notation - same as previous.  There is no -> operator like in c++. Go automatically converts
    pr.name = "ptr_to_rectangle"
    fmt.Println("Rectangle pr as address is: ", pr) //Go performs default printing of structs
    fmt.Println("Rectangle pr as value is: ", *pr) //address and value are differentiated with an & symbol
}
Rectangle r1 is: {2 1 my_r1}
Rectangle r2 is: {4 3 my_r2}
Rectangle pr as address is: &{8 6 ptr_to_rectangle}
Rectangle pr as value is: {8 6 ptr_to_rectangle}

以上の例では、以下の点に注意する必要があります.
  • {}によって属性値を初期化することができ、注意賦値は宣言の順序で,によって分割される.r1 := Rectangle{2, 1, "my_r1"}
  • : の形式で付与することもできる.r2 := Rectangle{width:3, name:"my_r2", length:4}
  • キーワードnewにより、オブジェクトのポインタを取得できます.
  • 取得したポインタは、属性石にアクセスし、*オペレータは不要です.
  • Goその構造体の属性に応じて、デフォルトの印刷メカニズムが提供される.

  • 構造体と変数のカプセル化と可視性
    他の言語には、publicprotectedprivateなどの宣言属性とメソッドの異なるコンテキストに対する可視性があります.Goに出会う前に、このようなデザインは間違いないと思います.Go可視性のサポートは簡単ですが、最初はこのデザインが下手だと思っていたかもしれません.くだらないことは言うまでもないが、Goでは、頭文字が大きくなったら、アウトソーシングに対して見えることを示している.うん、簡単だよ.
    type notExported struct { //this struct is visible only in this package as it starts with small letter
    }
    
    type Exported struct { //variable starts with capital letter, so visible outside this package
        notExportedVariable int //variable starts with small letter, so NOT visible outside package
        ExportedVariable int //variable starts with capital letter, so visible outside package
        s string //not exported
        S string //exported
    }  

    これは何ですか?何ですか.私が言いたいのは、これはまるで天才的なデザインですね.こんなに簡単で、こんなに明るくて、追加のキーワードは必要ありません.また、変数の頭文字を表示することで、時間をかけて検索する必要がなく、可視性を瞬時に知ることができます.他の言語では、この機能を実現するために変数の規定がある可能性があります.しかしGoはそれを大きく発揚した.
    Golangは不思議な言語で、一緒に進歩しましょう.