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)
}
}
この記事が気に入ったらサポートをしてみませんか?