
Go言語をマスターしたい 1日目
GOをマスターしたいと思った理由
今までPythonでちょこちょこ作っていたものの、デスクトップアプリやコマンドラインツールの作成がメインの自分としては、Pythonは使い勝手があまり良くなかった。
そこで、夏休みを利用して、シングルバイナリで配布しやすいと言われていたGO言語を勉強してみよう!と思い立ち、早速初めてみることにした。
また、せっかくなので悪戦苦闘した内容などを記録として残せば、後でみることもできるし、誰かの役に立つかもと言うことで記事にしてみようと思う。
今回学んだこと
1回目となる今回は、簡単なプロジェクトを作成して、実行してみるところまでやってみたが、簡単なプログラムであってもつまづくことが多いことを痛感した。
因みに、プロジェクト構成としては、go1フォルダの配下にmain.goとpractice1.goを作成した。作成当初のフォルダ構成とコードは以下の通り。
// フォルダ構成
go1/
├── main.go
└── practice1.go
// main.go
package go1
import "fmt"
func main() {
var message string = "こんにちは"
fmt.Println(message)
practice1.practiceMain()
}
// practice1.go
package go1
import "fmt"
func practiceMain() {
number := 1
fmt.println(number)
}
上記コードを見て、ナンジャコラって思った方も多いと思うが、そもそも初歩的なことが理解できていなかった。とりあえず誤って理解していた点を書いてみた。
packageに記載するのはプロジェクトフォルダ名だと思ってた。
プログラムにはそれぞれmain関数が必要。
packageについてだが、私はてっきりプロジェクトフォルダ名を記載するものだと思っていたがそうでなかった。正解としては、packageの指定はエントリーポイントとして動作するプログラムとそれ以外のプログラムで異なり、エントリーポイントで動作するプログラムのpackageは必ずmainを指定する。
そして、package mainを指定したプログラムにはmain()関数が必要で、このmain()関数がエントリーポイントとして認識される。因みにこのファイルがビルドされると、実行可能なバイナリファイルが生成される。
また、その他のパッケージについてはライブラリやモジュールとして機能するものの、これらのファイルはビルドコマンドとなる"go build"で実行可能なファイルにはならず、他のコードからインポートして利用される。
尚、私のコードだとpackage go1となっているのでエラーとなるので、
main.goのpackageを「package main」に修正して、practice1.goのpackageを「package practice1」に修正した。
さらにmain.goにて、practice1.goをサブモジュールとして読み込み、PracticeMain関数を実行したいので、"go1/practice1"をimportする必要がある。当初、このimportについてもよくわからない状態で書いていた。
importでは標準ライブラリの他、自分で作成したライブラリも読み込めるが、その場合、絶対パスで記載する必要がある点に注意が必要ことも初めて学ぶことができた。
さて、これでようやく実行できるぞ!と思いファイル保存しようとしたが、保存するとimportで指定した"go1/practice1"の箇所が消えてしまい、保存できない。。。
「ムムム、、」と思い、ChatGPTに土下座してみたところ、main.goで読み込んでいたpracitceMain関数とpractice1.goで定義していたpracticeMain関数の最初の文字が小文字になったいた。。。
赤っ恥かきながらも、該当箇所を修正して保存したらうまくいった。
関数名を間違えることは稀にあるものの、気をつけないといけないなぁと改めて思った次第である。尚、修正した内容を反映したコードやフォルダを貼り付けておく。
// フォルダ構成
go1/
├── main.go
└── practice1
└── practice1.go
// main.go
package main
import (
"fmt"
"go1/practice1"
)
func main() {
var message string = "こんにちは"
fmt.Println(message)
practice1.PracticeMain()
}
// practie1.go
package practice1
import "fmt"
func PracticeMain() {
number := 1
fmt.Println(number)
}
次回に向けて
今回、簡単なプログラムを実行できるところまで持っていった。
超簡単なプログラムだったが、かなり勉強になったと同時に、やはり自分で手を動かして作るのと、本を読むのではかなり違うなぁと言うことも改めて思い知った。
次回はもう少し、複雑なプログラムを作成する予定なので、読んでくれる人がいたら幸いだ。では、今回はここまで。