見出し画像

[学習メモ]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までの学習でいったん区切りたいと思います。

それでは!


この記事が気に入ったらサポートをしてみませんか?