Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

golangでクラスを使うには??(別ファイルで定義したクラスの利用も載せてみた)

今回は今までと毛色を変えてGo言語でクラスを用いる方法についてまとめていきたいと思います!!
さらに、定義するクラスと実際に用いるファイルは分けたいので別ファイルのクラスを用いる方法も合わせて載せていきます!!



■go言語でクラスって使えるの?

go言語でクラス定義が出来るのか??🤔
調べた結果、、、
go言語はオブジェクト指向言語ではないため、クラスという概念は存在しないようです。
ただし、クラス・オブジェクトが全く使えない。というわけではなく、
構造体・インターフェースに置き換えることが出来、疑似的にクラスのように利用することが可能になるようです。

■go言語でクラスっぽく書いてみる

では実際にgo言語で構造体を用いてクラスっぽく書いてみたいと思います。

コードはこちら。

package main

import (
	"fmt"
	"strconv"
)

type calculator struct{}

func (t calculator) pluse(a int, b int) int {
	return a + b
}

func (t calculator) minus(a int, b int) int {
	return a - b
}

func main() {
	var calcType calculator
	ret1 := calcType.pluse(2, 1)
	ret2 := calcType.minus(2, 1)

	fmt.Println("ret1:" + strconv.Itoa(ret1) + ", ret2:" + strconv.Itoa(ret2))
}

こちらのコードは加算、減算を行うクラス(構造体)を定義し、メイン関数にて呼び出して返り値をログ出力しているコードになります。
こちらがクラスっぽく記載した構造体定義になります。

type calculator struct{}

func (t calculator) pluse(a int, b int) int {
	return a + b
}

func (t calculator) minus(a int, b int) int {
	return a - b
}

こちらのように定義することで、

var calcType calculator
ret1 := calcType.pluse(2, 1)
ret2 := calcType.minus(2, 1)

というように呼び出せば使えるようになります。
少しクセはありますが、クラスのように使えてますね!!

少しだけ脱線してしまいますが、、、
数値(int型)を文字列に変換する場合には、

import (
	"strconv"
)
 strconv.Itoa(数値)

というように strconv.Itoaを用いればOKです。

■別ファイルで定義したクラス(構造体)を呼び出してみる

では、別ファイルで定義した構造体を呼び出す方法についてまとめていきます。

まずフォルダ構成ですが、今回はこちらとします。

|
|-function
|         |-func1.go
|-main.go

ではfunc1.goのコードを作成します。

//func1.go

package func1

type Calculator struct{}

func (t Calculator) Pluse(a int, b int) int {
	return a + b
}

func (t Calculator) Minus(a int, b int) int {
	return a - b
}

コードは先ほどと同様に加算・減算を定義します。
先ほどのコードと大きく異なる点があります。
それは、、、
各構造体や関数の頭文字を大文字にしていることです。
別ファイルから読み出す際には頭文字を大文字にしないとエラーになってしまうようです😅
ハマりやすいところなので注意!!

そしてmain.goはこちら。

package main

import (
	"./function"
	"fmt"
	"strconv"
)

func main() {
	var calcType func1.Calculator
	ret1 := calcType.Pluse(2, 1)
	ret2 := calcType.Minus(2, 1)

	fmt.Println("ret1:" + strconv.Itoa(ret1) + ", ret2:" + strconv.Itoa(ret2))
}

まず、importにフォルダ名であるfunctionを定義します。
そして、

pakage名.構造体名

といったように定義を行い後は先ほどと同様に関数を呼び出せばOKです。

そこまで難しくはないのですが、やはり大文字にする点は注意が必要ですね。。
思わぬ落とし穴にはまってしまいそうなので注意したいと思います!!

■最後に

go言語はオブジェクト指向ではないのでクラスという概念がないことは知らなかったので勉強になりました!!
まだまだgo言語は知らない点が多いので勉強していきたいと思います!!
知らない点はまた記事に上げたいと思います。