[学習メモ]A Tour of Go[More types: structs.]
既存の型に基づいて新しい型を定義する方法を学ぶ。
Pointers
ポイントは値のメモリアドレスを指す。
引用
変数 T のポインタは、 *T 型で、ゼロ値は nil です。
var p *int
nilってなんだろう??
Go 言語では,ある型の値が「宣言されていない」状態のことを「ゼロ値(zero value)」と呼んでいる。
たとえば int などの数値型では「ゼロ値」として数値の 0 を, bool では false を,文字列では空文字列をとる。
同じようにポインタ型や interface 型などでは nil を「ゼロ値」としましょう,ということなのである。
このように仕様として定義することで曖昧な状態を排除でき,私達ユーザは安心してその変数を使用することができるわけだ。
したがって nil は状態を表す「識別子」あるいは「表現」に過ぎず1,それ自身は型も値も持たない2。 強いて言うなら(プログラミング言語で最も悪名高いとされる3)「null 参照」の一種だとは言えるだろう。
引用:https://text.baldanders.info/golang/nil-is-nil/#:~:text=Go%20%E8%A8%80%E8%AA%9E%E3%81%A7%E3%81%AF%EF%BC%8C%E3%81%82%E3%82%8B%E5%9E%8B,%EF%BC%89%E3%80%8D%E3%81%A8%E5%91%BC%E3%82%93%E3%81%A7%E3%81%84%E3%82%8B%E3%80%82&text=%E5%90%8C%E3%81%98%E3%82%88%E3%81%86%E3%81%AB%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E5%9E%8B,%E3%81%97%E3%82%87%E3%81%86%EF%BC%8C%E3%81%A8%E3%81%84%E3%81%86%E3%81%93%E3%81%A8%E3%81%AA%E3%81%AE%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82
ポインタはPHPを書いている時も値渡し、参照渡しでたまに意識することがあるので、この機会にちゃんと勉強したいです。
Structs
構造体。フィールドの集まり。
type Vertex struct {
X int
Y int
}
Struct Fields
structのフィールドは、ドット( . )を用いてアクセスする。
package main
import "fmt"
type Vertex struct {
X int
Y int
}
func main() {
v := Vertex{1, 2}
v.X = 4
fmt.Println(v.X)
}
なんか連想配列の扱い方に似ているなと思いました。。
Struct Literals
フィールドの値を列挙することで新しいstructの初期値の割り当てを行う。
name:構文でフィールドの一部のみを初期化することも可能。
package main
import "fmt"
type Vertex struct {
X, Y int
}
var (
v1 = Vertex{1, 2} // has type Vertex
v2 = Vertex{X: 1} // Y:0 is implicit
v3 = Vertex{} // X:0 and Y:0
p = &Vertex{1, 2} // has type *Vertex
)
func main() {
fmt.Println(v1, p.X, v2, v3)
}
Arrays
[n]T 型は、型 T の n 個の変数の配列( array )を表す。
package main
import "fmt"
func main() {
var a [2]string
a[0] = "Hello"
a[1] = "World"
fmt.Println(a[0], a[1])
fmt.Println(a)
primes := [6]int{2, 3, 5, 7, 11, 13}
fmt.Println(primes)
}
オブジェクトの配列を扱うときはstructで宣言した型を使用するのだろうか・・・?
例えば
var a [10]Vertex
みたいな?
とりあえずStructまでの学習でいったん区切りたいと思います。
それでは!
この記事が気に入ったらサポートをしてみませんか?