m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

go言語の学習メモ7(クラスとして使用)

クラスは存在しない

ので構造体をクラスのように使用するしかない

基本

sample1.go
package main

import (
	"fmt"
)

// 定義
type Car struct{
	name string
}

// メソッド
func (p *Car) msg(){
	fmt.Println(p.name)
}

// 初期化
func (p *Car) init(){
	p.name = "くるま"
}

// main
func main() {
	fmt.Println("start")

	var d Car
	d.init()
	d.msg()

	fmt.Println("end")
}

$ go run sample1.go 
start
くるま
end
$

一番シンプルな方法になります。構造体の中で定義した変数や関数などを使用する場合はfuncの前に構造体のポインタを指定するなどちょっとした対応が必要になるくらい

継承もどき

sample2.go(移譲っぽい?)
package main

import (
	"fmt"
)

/**
 * Car Class定義
 */
// 定義
type Car struct{
	name string
}

// メソッド
func (p *Car) msg(){
	fmt.Println(p.name)
}

// 初期化
func (p *Car) init(){
	p.name = "くるま"
}

/**
 * Bus Class定義
 * Car Classよりポインタで埋め込み
 */
type Bus struct {
	*Car
	weight int
}

// 初期化
func (p *Bus) init2(){
	p.init()
	p.name = "ばす"
	p.weight = 1000
}

// メソッド
func (p *Bus) msg2(){
	fmt.Println(p.weight)
}

// main
func main() {
	fmt.Println("start")

	var d Car
	d.init()

	//d2 := Bus{&d, 0}
	d2 := Bus{&d, 0}
	d2.init2()
	d2.msg()	// 継承メソッド
	d2.msg2()	// 独自メソッド

	fmt.Println("end")
}

$ go run sample2.go 
start
ばす
1000
end
$
sample3.go(継承っぽい?)
package main

import (
	"fmt"
)

/**
 * Car Class定義
 */
// 定義
type Car struct{
	name string
}

// メソッド
func (p *Car) msg(){
	fmt.Println(p.name)
}

// 初期化
func (p *Car) init(){
	p.name = "くるま"
}

/**
 * Bus Class定義
 * Car Classよりポインタで埋め込み
 */
type Bus struct {
	Car
	weight int
}

// 初期化
func (p *Bus) init2(){
	p.init()
	p.name = "ばす"
	p.weight = 1000
}

// メソッド
func (p *Bus) msg2(){
	fmt.Println(p.weight)
}

// main
func main() {
	fmt.Println("start")

	var d Car
	d.init()
	
	var d2 Bus
	d2.init2()
	d2.msg()	// 継承メソッド
	d2.msg2()	// 独自メソッド

	fmt.Println("end")
}

こちらの場合は宣言時にオブジェクトのポインタ渡しは不要

所感

やってみていろいろ躓いているけどオーバーロードが使えないとか…
デザインパターンとかは苦手なんで分かる範囲でなんとかしていこう


参考


[Go] 構造体の初期化方法まとめ - Qiita


Goのstructとinterface - おいぬま日報