Go言語ことはじめ

環境

  • Windows10
  • Chocolatey導入済み

Go言語の導入

choco install golang を実行すると、Go言語をインストールできます。
更新するときは choco upgrade golang でできます。

VSCodeに拡張機能を導入

Image from Gyazo

拡張機能検索にGoと入力すると、一番上に公式の拡張機能が出てくるのでインストールします。

インストールが終わったら、コマンドパレット(Ctrl+Shift+P)を開き、Go: Install/Update Toolsを検索して、実行します。

すると、拡張機能の動作に必要なツール一式がダウンロードされます。

これで拡張機能の導入は完了です。

書いてみる

hello.goを作成します。
内容を以下のように作成します。

1
2
3
4
5
6
7
8
9
package main

import (
"fmt"
)

func main() {
fmt.Println("Hello, world.")
}

そして保存、go run hello.goを実行するとHello, world.が実行されます。

解説

package

感覚的にはJavaやC#などの名前空間に近いですが、厳密には違うものみたいです。

これは、importするときに指定される名前です。

基本的にはディレクトリ名を付けることが推奨されていて、例えばappというディレクトリにmain.goを作ったとすると、最初をpackage appとすることが推奨されているということです。

Go Modulesの仕様上、外部からダウンロードしたパッケージと被っても問題ありません。

そこらへんはここに書いてます Goで独自パッケージがimportできない - MinatoNote

そしてこれが最も重要ですが、ルートディレクトリに配置されているプログラムはpackage mainとする必要がります。

そうしないとgo run: cannot run non-main packageというエラーで実行できません。

import

パッケージをimportします。

今回は、fmtというgolangの入出力を司るパッケージをimportしました。

golangには、github上に無数のパッケージが存在していて、go get [repos]というコマンドで簡単にダウンロード、importすることができます。

これによって、開発を高速化することが可能です。

func main()

funcと聞けば関数ということはまぁわかると思うんですが、golangでは、main()という関数が一番最初に実行されます。

なので、func main()としています。

mainパッケージ内では、かならずmain関数を書かなければなりません。

mainパッケージにmain関数が存在しない場合は function main is undeclared in the main package エラーが発生します。

おわり

以上がGo言語ことはじめです。

正直今回は、Goを使う上での目玉機能には全く触れていません。

  • めっっちゃ楽な並列処理
  • ビルドして高速実行できる機能

など、Goには素晴らしい機能が何個かあります。
これはもしかしたら続きの記事を作るかもしれないです。

Goで独自パッケージがimportできない

現在、以下の構成

1
2
3
4
5
warbot-go
├ test
│ └ test.go
├ go.mod
└ hello.go

この状態でhello.goからtest.goをimportできない。
まず、保存しようとするとコードが消える

これはVSCodeに入れているGolintが消してるっぽい
ログには
Not able to determine import path of current package by using cwd: c:\Users\Minato86\repos\MyRepository\warbot-go and Go workspace:
と記録されていた。

まずは今の状況を振り返っておくと

  • go mod init warbot-goでmodを初期化済み
  • go envGO111MODULEはonになっている

というわけで、今はGo Modulesが使える環境が整っているはずです。

main.gotest.goは以下のようになっています

main.go

1
2
3
4
5
6
7
8
9
10
11
package main

import (
"fmt"
//ここに"warbot-go/test"をimportしたい
)

func main() {
fmt.Println("Hello, world.")
}

test.go

1
2
3
4
5
6
7
8
9
package test

import (
"fmt"
)

func Test() {
fmt.Println("test module ready.")
}

linterを無効にしてみる

2fd55a2ce3bace7661665a70d5dd51c9.png

VSCodeのワークスペース設定から、Lint On Saveをoffにしてみる。

結論からいうと、offにしたのに普通に実行された。
なんでや。と思ったら、どうやらこの動作はlinterの仕業ではなく、formatterの仕業みたい。

formatterを変えてみる

b373f1c941646a7873dc5913665eb082.png

デフォルトのgoreturnsではなく、gofmtに変えてみた。
結論から言えば、うまくいった。

1
2
3
4
5
6
7
8
9
10
11
package main

import (
"fmt"
"warbot-go/test"
)

func main() {
test.Test()
fmt.Println("Hello, world.")
}

消されずにこのように書くことができた。
また、普通に実行できた。

そういえば

Githubでリポジトリを公開する場合、こっちのほうが正しいっぽい

go mod init github.com/chipsnet/warbot-go

あとはimportもgithub.com/chipsnet/warbot-go/testに書き換える。

↓GoなんもわからんからDiscordBotを作っている
GitHub - Chipsnet/warbot-go: WARbot written in golang