PUROGU LADESU

ポエムがメインのブログです。

【Golang】 6 構造体

メソッド

定義済みstructに関連付けてドットで呼び出せる関数(値レシーバ)

//v.Area()
func (v Ver) Area() int {

structを参照渡しして、メソッド内で中身を書き換えるもの(ポインタレシーバ)

//v.Scale(5)
func (v *Ver) Scale(i int) {

コンストラク

structをプライベートにすると他のパッケージからアクセスできないので
Newメソッドで初期化する

func New(x, y int) *Ver {
	return &Ver{x, y}
}

packageName.Newすることでstructを返す

embeded

structの中にstructを定義すると、クラス継承みたいな感じで拡張できる

type VerEx struct {
	Ver //名前を書くだけ
	z int
}

func New(x, y, z int) *VerEx {
	return &VerEx{Ver{x, y}, z}
}

non-struct

structではないカスタム型もメソッドをつけられる

type MyInt int
func (i MyInt) Double() int {

interface

メソッド名だけ書かれている型

type Human interface {
	Say()
}

structがメソッドを実装してないとエラーになる

structを作るときに変数の後ろにつける

var mike Human = Person{"Mike"}

引数をinterfaceで宣言して、メソッドを実装済みのstructのみ受け付けるようにできる(ダックタイピング)

タイプアサーション

引数の型を interface{} にすれば何でも渡せる
その場合、i.(int) などで型を変換することをタイプアサーションという
インターフェースでない通常の型の変換(タイプコンバージョン、キャスト)とは違う

switch type文で複数の型に対応

Stringer

string()メソッドを実装するとそれが標準出力になる

func (p Person2) String() string {

カスタムエラー

自分なりのエラーを出したい場合はString()同様、Error()を実装すればよい

func (e *UserNotFound) Error() string {
// Error()はポインタ型推奨

エラーを比較するときはポインタで比較しないと同じエラーになっちゃう