Golang基礎_07-構造体struct

ディレクトリ

@

定義と使用

  • Cの構造体に行くと非常によく似た構造体と全くクラスを行く、コンストラクタ
  • 使用type <name> strct{}名は、可視性のルールに従う構造定義は、(資本で始めることは公衆を表し、プライベートとして非資本から始まります)
  • 自体(この??に類似)のメンバーへのポインタ型ポインティング

  • あなたは、構造体を初期化するためにリテラルを使用することができます
  • 構造体のメンバは、直接ポインタの読み込みを許可(「」)

type person struct{
    Name string
    Age int
}
func main(){
//go语言习惯上定义的时候用取地址符,这样作为指针使用会很方便,而且是不是指针都可以直接用'.'来取值
    a := &person{}
    a.Name = "joe"
    a.Age = 19
    /*字面值对结构进行初始化
    a := &person{
        Name: "joe",
        Age: 19,
    }
    */
    a.Name = "ok"
    fmt.Println(a)
    A(a)
    fmt.Println(a)
    B(a)
    fmt.Println(a)
}
func A(per person){
    //值拷贝
    per.Age = 13
    fmt.Println("A",per)
}
func B(per *person){
    //引用拷贝
    per.Age = 13
    fmt.Println("A",per)
}
/*
> Output:
{joe 19}
A {joe 13}
{joe 19}
A &{joe 13}
{joe 13}
*/

匿名構造

  • 匿名の支持構造は、定義されたメンバーまたはメンバー変数として使用することができます
  • 匿名の構造は、の値をマッピングするために使用することができます
func main(){
//匿名结构
    a := &struct {
        Name string
        Age int
    }{
        Name : "joe",
        Age : 19,
    }
    fmt.Println(a)
}
type person struct {
    Name string
    Age int
    Contact struct{
        Phone, City string
    }
}
func main(){
    a := person{Name:"joe", Age: 19}
    a.Contact.Phone = "1234565875"
    a.Contact.City = "beijing"
    fmt.Println(a)
}

匿名フィールド

  • 匿名のフィールドをサポートし、基本的に型にフィールドという名前の名を定義します
  • 匿名フィールドとして埋め込まれた構造は、継承のように見えますが、継承されません
  • あなたは匿名フィールドのポインタを使用することができます
type person struct {
    string
    int
}
func main(){
//字段顺序一定要一致
    a := person{"joe", 19}
    b := a
    fmt.Println(a)
    fmt.Println(b)
}

構造体との間の割り当てと比較

  • 同じタイプのメンバーが直接割り当てをコピーすることができます
  • そして、サポート==!=比較演算子、必ず同じタイプとの比較ではなく、>または<
type person struct {
    Name string
    Age int
}
type person1 struct {
    Name string
    Age int
}
func main(){
    a := person{Name:"joe", Age:19}
    b := person1{Name:"joe", Age:19}
    fmt.Println(a)
    fmt.Println(b)
    fmt.Println( b == a)
}
/*
> Output:
command-line-arguments
# command-line-arguments
.\hello2.go:18:15: invalid operation: b == a (**mismatched types person1 and person)**
*/

埋め込み構造

  • 言語クラスを移動して、何の継承はありません
  • 上のタイプ名として埋め込まれた構造名
type human struct{
    Sex int
}
type teacher struct {
    human
    Name string
    Age int
}
type student struct{
    human
    Name string
    Age int
}

func main(){
    a := teacher{Name:"joe", Age:19,human: human{Sex:0}}
    b := student{Name:"joe", Age:19,human: human{Sex:1}}
    a.Name ="joe2"
    a.Age = 13
    a.Sex =100
    fmt.Println(a, b)
}
/*
> Output:
command-line-arguments
{{100} joe2 13} {{1} joe 19}
*/

匿名フィールドまたは埋め込みフィールドを使用する場合は、内側と外側の構造が同じフィールド名を持っている場合、どのようにそれを行うには?

type A struct {
    B
    C
    Name string
}
type B struct {
    Name string
}
type C struct {
    Name string
}

func main(){
    a := A{Name:"A",B: B{Name:"B"},C: C{Name:"C"}}
    fmt.Println(a.Name, a.B.Name,a.C.Name)
}
/*
> Output:
command-line-arguments
A B C
*/

現在の階層では見られない、見つけることより深い構造である
ここで説明する絵を書きます
写真を、C内部の構造ならば、それは曖昧a.Nameになります

おすすめ

転載: www.cnblogs.com/leafs99/p/golang_basic_07.html