【Go语言】结构体

【Go语言】结构体

我已经完成了学习Golang的基础知识,包括学习到创建Web应用程序,现在我将进行复习并总结。从基础到应用。

package main 
//struct 構造体
//クラスのような感じ

import (
    "fmt"
)

//struct
//型
//キャピタル=頭文字を大文字にする。小文字だと外部からアクセスできない
type Vertex struct {
    X int
    Y string
    Z int
}

//3 値を書き換える関数は、引数をポインタ型にする
//関数 Xを書き換える
//引数がポインタ型ではないので変わらない
func Changev(v Vertex) {
    v.X = 100000
}

//関数 Yを書き換える
//引数はポインタ型で渡す
func Changev2(v *Vertex) {
    //本当は下記で書くといいが、
    // (*v).X = 1000
    //下記でも、自動で*vにしてくれる
    v.X = 1000000
}

func main() {
    //1
    //宣言
    v := Vertex{X: 1, Y: "A"}
    fmt.Println(v)
    //>>{1 A 0}

    //値にアクセス
    fmt.Println(v.X, v.Y, v.Z)
    //>>1 A 0

    //上書き
    v.X = 2
    fmt.Println(v.X)
    //>>2

    //宣言
    //複合リテラルs
    //順番に値を入れる
    v2 := Vertex{1, "B", 100}
    //Xのみ 他はデフォルトが入る
    v3 := Vertex{X: 1}
    fmt.Println(v2)
    //>>{1 B 100}
    fmt.Println(v3)
    //>>{1  0}


    //アドレスはない
    //宣言 空 デフォルト値が入る
    v4 := Vertex{}
    fmt.Println(v4)
    //>>{0  0}
    fmt.Printf("%T %v\n", v4, v4)
    //>>main.Vertex {0  0}


    //別の書き方 空
    var v5 Vertex
    fmt.Println(v5)
    //>>{0  0}
    fmt.Printf("%T %v\n", v5, v5)
    //>>main.Vertex {0  0}


    //new
    //アドレスが帰ってくる。
    //v4,v5とは意味合いが違う
    v6 := new(Vertex)
    fmt.Println(v6)
    //>>&{0  0}
    fmt.Printf("%T %v\n", v6, v6)
    //>>*main.Vertex &{0  0}


    //v6と同じ表現(アドレス)をnewを使わないで表現
    //明示的にアドレスを取得したい場合はこっちを使う場合が多い
    v7:= &Vertex{}
    fmt.Println(v7)
    //&{0  0}
    fmt.Printf("%T %v\n", v7, v7)
    //>>*main.Vertex &{0  0}


    //2
    //空を作る
    //スライスとかマップの場合はmake([]int, 0)の方が多い
    /*
            s := make([]int, 0)
            s := []int{}
            fmt.Println(s)
    */
    //goは書き方が複数あって困惑するが、今は書き方が複数あるということが理解できていればOK


    //3 構造体は値型
    //応用
    //値を書き換えたい
    v8 := Vertex{3, "B", 1000}
    //値渡しなので、コピーが作られて渡される
    Changev(v8)
    //書き換わらない
    fmt.Println(v8)
    //>>{3 B 1000}

    //書き換えたい場合 アドレス渡しにする
    v9 := &Vertex{4, "C", 122}
    //参照渡し
    Changev2(v9)
    fmt.Println(v9)
    //>>&{1000000 C 122}


}
广告
将在 10 秒后关闭
bannerAds