エンジニアもどきの雑記

メモ帳です。きっと。macアプリ配信windowsでもできるようになるまで絶対にメイン機にしないマン。特筆しない限り環境は【win10home,i5-7200u,8g,64bit,巨乳が好き】

GoLangやるpart2

前回
dddpga1.hateblo.jp


今回は別のファイルを読み込んでくるとこ。
一個ずつ積み重ねていくよー。


さて、
他の言語でも当然そうだけど、コードが助長になってくれば
ファイルを分割して役割を管理したりするのは当然。
オブジェクト指向が使える言語だとそれが当然だし他でもまぁそうだよね。

ってことで基礎文法より先にまずそっち。


前回使ったmain.goがあるディレクトリを使う。
goのgorootによるディレクトリ周りは他で調べてください。
導入と同時に絶対学ぶことになると思うけど。多分ここでは書かない。

mkdir owls

[(゜-゜):daichi]@:sample$ ls
hello  main.go  owls


owlsディレクトリを作成する。
何故owlsかって知ってる人は知っている。うちには七羽のメンフクロウがいるからだ。


さて、owlsディレクトリの配下に二つとりあえずファイルを作成する。
touch owls/barnowl.go owls/eagleowl.go

[(゜-゜):daichi]@:sample$ ls owls/
barnowl.go  eagleowl.go


[(゜-゜):daichi]@:sample$ tree ../sample/
../sample/
├── hello
├── main.go
└── owls
    ├── barnowl.go
    └── eagleowl.go

1 directory, 4 files


とりあえずこんな感じね。

で、barnowl.goeagleowl.goそれぞれに処理を入れておく。

barnowl.go

package owls

func Barnowl() string {
        return "so cute"
}



eagleowl.go

package owls

func Eagleowl() string {
        return "so big"
}


それぞれに文字列を返す関数を入れた。
packageは所属するディレクトリ名のowls。
前回書いたけどimportするものがないのでimportは省略可能。
ちなみに、だけど関数名の最初が大文字なのはpublicを表すらしい。小文字だとprivateだったはず。
関数の書き方は今更だけど以下

func 関数名() 返り値 {
    //処理
}

よくある

function string hoge() {
}

とは返り値の型を書く場所が逆なのでした。


では、早速それぞれをmain.goから呼び出してみる。

main.go

package main

import (
        "./owls"
        "fmt"
)

func main() {
        barnowlIs := owls.Barnowl()
        eagleowlIs := owls.Eagleowl()

        fmt.Println("Barn owl is " + barnowlIs)
        fmt.Println("Eagle owl is " + eagleowlIs)
}


まずはowls packageをimportして使えるようにする。
そして、変数に入れて表示させる。
関数内での変数宣言と初期化が以下
変数名 := 値

var 変数名 = 値
とか諸々あるけど今度詳しくやる。

owls packageからの呼び出しは.で呼び出せる。
owls.Barnowls()

文字列との連結はjsと同様+で行う。
fmt.Println("Barn owl is " + barnowlIs)

で、実行してみる。

[(゜-゜):daichi]@:sample$ go run main.go
Barn owl is so cute
Eagle owl is so big


成功!

うんうん。わかってきたよね。
他のファイルの読み込みかたと基礎文法的なものがわかってくれば組み立てが楽になるしね。
うん。

今回のowls packageだけど、goのルールとして
同一ディレクトリには一つのパッケージしかあってはならないってのがある。
だからディレクトリ名で統一する。
例えばowlsディレクトリ内にdogs packageのファイルとかを作るとエラーになる。

で、こうなるとmain.goの階層にも他のファイルを突っ込んでみたくなる。
例えば以下

main.goと同じ階層にsub.goを作成。文字列返すだけ。
sub.go

package main

func SubText() string {
        return "hoge"
}


main.goから呼び出して使ってみる

main.go

package main

import (
        "./owls"
        "fmt"
)

func main() {
        barnowlIs := owls.Barnowl()
        eagleowlIs := owls.Eagleowl()

        subText := SubText()

        fmt.Println("sub " + subText)

        fmt.Println("Barn owl is " + barnowlIs)
        fmt.Println("Eagle owl is " + eagleowlIs)
}


同じ階層なのでimportしない。
で、実行


[(゜-゜):daichi]@:sample$ go run main.go
# command-line-arguments
./main.go:12:13: undefined: SubText


うわ、出たよundefined
これ、実行時、build時にmain.goのディレクトリでmain.goを指定したら、owlsのように読み込んでくれるのではなく、
同階層内のsub.goは自動的に読み込んでくれるってわけではないらしい。

なので、main.goと同じように指定すればいいらしいんだけど、
go run main.go sub.go
ってわざわざすべて指定するより、

go run *.go
ってワイルドカードで指定できるらしいのでこっちで実行してみる。

[(゜-゜):daichi]@:sample$ go run *.go
sub hoge
Barn owl is so cute
Eagle owl is so big



でけた!


じゃあbuildしてみる


go build -o owlis main.go
って、これじゃまたmain.goを指定してるから~
と思って
go build -o owlis *go
する

[(゜-゜):daichi]@:sample$ go build -o owlis *.go
[(゜-゜):daichi]@:sample$ ls
hello  main.go  owlis  owls  sub.go


[(゜-゜):daichi]@:sample$ ./owlis
sub hoge
Barn owl is so cute
Eagle owl is so big



ok。

とりあえず実行、buildするときは*.goって指定するとよさげ。



今日はここまで。
一回終えた本を見ながらやってるけど、ほんといい復習になるから
やっぱりアウトプットって大事だと思う。

また次回。

次回
dddpga1.hateblo.jp