0
0

More than 3 years have passed since last update.

【Golang】構造体

Posted at

【Golang】構造体

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}


}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0