メソッド
定義済み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()はポインタ型推奨
エラーを比較するときはポインタで比較しないと同じエラーになっちゃう