【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}
}