見出し画像

Go -④基本-

◼︎メソッド、値レシーバ、ポインタレシーバ

◼︎出力

メソッド 12
値レシーバ 12
ポインタレシーバ -> 値レシーバ 1200

◼︎コード

package main

import "fmt"

type Vertex struct {
	// 小文字で宣言するとprivateの意味となる。
	X, Y int
}

// 値レシーバ(Vertexに紐付く関数とすることができる)
func (v Vertex) Area() int {
	return v.X * v.Y
}

// ポイントレシーバ
func (v *Vertex) Scale(i int) {
	v.X = v.X * i
	v.Y = v.Y * i
}

func Area(v Vertex) int {
	return v.X * v.Y
}

/**
 * main関数
 * フォーマットする場合
 * gofmt -w ファイル名
 */
func main() {
	v := Vertex{3, 4}
	fmt.Println("メソッド", Area(v))
	fmt.Println("値レシーバ", v.Area())

	v.Scale(10)
	fmt.Println("ポインタレシーバ -> 値レシーバ", v.Area())
}


◼︎コンストラクタ

Factory methodみたいな感じ

◼︎出力

12

◼︎コード

package main

import "fmt"

type Vertex struct {
	// 小文字で宣言するとprivateの意味となる。
	x, y int
}

// 値レシーバ(Vertexに紐付く関数とすることができる)
func (v Vertex) Area() int {
	return v.x * v.y
}

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

/**
 * main関数
 * フォーマットする場合
 * gofmt -w ファイル名
 */
func main() {
	v := New(3, 4)
	fmt.Println(v.Area())
}


◼︎Embedded

他言語の継承に相当する。

◼︎出力

1200
6000000

◼︎コード

package main

import "fmt"

type Vertex struct {
	x, y int
}

func (v Vertex) Area() int {
	return v.x * v.y
}

func (v *Vertex) Scale(i int) {
	v.x = v.x * i
	v.y = v.y * i
}

type Vertex3D struct {
	Vertex
	z int
}

func (v Vertex3D) Area3D() int {
	return v.x * v.y * v.z
}

func (v *Vertex3D) Scale3D(i int) {
	v.x = v.x * i
	v.y = v.y * i
	v.z = v.z * i
}

func New(x, y, z int) *Vertex3D {
	return &Vertex3D{Vertex{x, y}, z}
}

/**
 * main関数
 * フォーマットする場合
 * gofmt -w ファイル名
 */
func main() {
	v := New(3, 4, 5)
	v.Scale(10)
	fmt.Println(v.Area())

	v.Scale3D(10)
	fmt.Println(v.Area3D())
}


◼︎non-struct

◼︎出力

main.MyInt 10
int 1
20

◼︎コード

package main

import "fmt"

type MyInt int

func (i MyInt) Double() int {
	fmt.Printf("%T %v\n", i, i)
	fmt.Printf("%T %v\n", 1, 1)
	return int(i * 2)
}

/**
 * main関数
 * フォーマットする場合
 * gofmt -w ファイル名
 */
func main() {
	myInt := MyInt(10)
	fmt.Println(myInt.Double())
}


◼︎interfase

◼︎出力

Mr.TOM
RUN
Mr.X
GET OUT

◼︎コード

package main

import "fmt"

type Human interface {
	Say() string
}

type Person struct {
	Name string
}

func (p *Person) Say() string {
	p.Name = "Mr." + p.Name
	fmt.Println(p.Name)
	return p.Name
}

func DriveCar(human Human) {
	if human.Say() == "Mr.TOM" {
		fmt.Println("RUN")
	} else {
		fmt.Println("GET OUT")
	}
}

/**
 * main関数
 * フォーマットする場合
 * gofmt -w ファイル名
 */
func main() {
	var tom Human = &Person{"TOM"}
	DriveCar(tom)

	var x Human = &Person{"X"}
	DriveCar(x)
}


◼︎type assertion

◼︎出力

20
Mike!!
Don't konw %!T(MISSING)
10 10

◼︎コード

package main

import "fmt"

// switch - typeはセット
func do(i interface{}) {
	switch v := i.(type) {
	case int:
		fmt.Println(v * 2)
	case string:
		fmt.Println(v + "!!")
	default:
		fmt.Printf("Don't konw %T\n")
	}
}

/**
 * main関数
 * フォーマットする場合
 * gofmt -w ファイル名
 */
func main() {
	// type assertion interfase{}.(型)
	do(10)
	do("Mike")
	do(true)

	// type conversion 型(値)
	var i int = 10
	ii := float64(10)
	fmt.Println(i, ii)
}


◼︎Stringer

JavaのtoString()相当。

◼︎出力

My name is tom

◼︎コード

package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

func (p Person) String() string {
	return fmt.Sprintf("My name is %v\n", p.Name)
}

/**
 * main関数
 * フォーマットする場合
 * gofmt -w ファイル名
 */
func main() {
	tom := Person{"tom", 22}
	fmt.Println(tom)
}


◼︎カスタムエラー

「& -> *」 &で渡して*で受け取る。

◼︎出力

User not found: mike

◼︎コード

package main

import "fmt"

type UserNotFound struct {
	Username string
}

func (e *UserNotFound) Error() string {
	return fmt.Sprintf("User not found: %v", e.Username)
}

func myFunc() error {
	ok := false
	if ok {
		return nil
	}
	return &UserNotFound{Username: "mike"}
}

/**
 * main関数
 * フォーマットする場合
 * gofmt -w ファイル名
 */
func main() {
	if err := myFunc(); err != nil {
		fmt.Println(err)
	}
}


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