目次
GO言語のインストールと開発環境
この記事で、GO言語(golang)に興味がわきました。
PHP5.6の82倍!、PHP7の30倍!というGO言語の圧倒的な速度は魅力です。
インストール
こちらのサイトからWindowsのインストーラをダウンロードして実行します。
インストールに悩むところは、ないと思います。
環境変数の設定とかもインストーラが面倒見てくれてるみたいなので、特に追加設定はせず、コマンドプロンプト(CMD)で以下を実行して動作確認します。
go version
開発環境
開発にはVSCode(Visual Studio Code)を使います。
VSCode(Visual Studio Code)のインストールがまだなら、以下のサイトからインストーラをダウンロードして、VSCodeのインストールを先に行います。
VSCodeがインストールされたPCで、以下のWEBページを開き「innstall」ボタンを押し、表示されるダイアログで「continue」します。
VSCodeが立ち上がってくるので、VSCode上で再度「install」ボタンを押します。
インストールできたら、VSCodeで「Ctrl+Shift+p」を押しコマンドパレットを表示して、以下を入力して実行します。
Go: Install/Update Tools
インストールするか聞いてきます。
「install All」を選んで以下のモジュールをすべてインストールします。
最後に「you are ready to Go」が表示されたら完了です。
これで開発環境設定は終わりで、デバッグも可能になっています。
GO言語の最低限の文法
次に「GO言語の最低限の文法」です。
最低限の文法:パッケージとimport
Goのプログラムは、プログラムは main パッケージから開始されます。
package main
importは{}でくくって宣言するのが推奨です。
import (
"fmt"
"math"
)
最低限の文法:関数
関数は「func」で宣言します。
main()がまず実行されます。
func main() {
fmt.Println(add(42, 13))
}
関数の引数は必ず型を宣言する必要があります。
戻り値の型も宣言が必要です。
型(例だとint)を後ろに置くのが特徴的です。
func add(x int, y int) int {
return x + y
}
関数の戻り値は複数戻すことも可能です。
func swap(x, y string) (string, string) {
return y, x
}
最低限の文法:変数と定数
変数は「var」で宣言します。
外部パッケージから参照可能かどうか(他でいうpublic、private)の区別は名前付けルールで行います。
外部パッケージから参照可能な変数は「大文字」、パッケージ内だけしか参照できない変数は「小文字」で始めます。
型は後ろに置きます。
複数の変数をいっぺんに初期化することもできます。
var i, j int = 1, 2
関数の中だと、varを使わずに「:=」で暗黙的な宣言もできます。
関数内で使い捨てのカウンタみたいなものに便利そうです。
k := 3
これは型変換の代入(cast)にも使えます。
i := 42
f := float64(i)
定数はconstで宣言します。
const Pi = 3.14
最低限の文法:配列とスライス
配列の宣言もvarでします。
型を後ろにおくのは同じです。
var a [2]string
a[0] = "Hello"
a[1] = "World"
配列は固定長です。
動的な「スライス」も作れます。
ゼロ値は nil です。
append()で追加できます。
var s int
s = append(s, 0)
宣言時の初期化もできるし、pythonのスライスっぽい参照の仕方ができます。
s := int{2, 3, 5, 7, 11, 13}
s = s[1:4]
最低限の文法:構造体
GOにはオブジェクト指向みたいなクラスはありません。
struct(構造体)は使えます。
type Vertex struct {
X int
Y int
}
最低限の文法:map
mapもあります。
mapは宣言して、使う前にmakeで初期化しないといけません。
以下の例では、上記で定義した構造体(Vertex)を使っています。
var m map[string]Vertex
m = make(map[string]Vertex)
m["dummy"] = Vertex{
40.68433, -74.39967,
}
mapへの追加・要素の取得・削除の仕方です。
m[key] = elem
elem = m[key]
delete(m, key)
mapの要素の存在確認はちょっと変わっていて、例えば、keyが存在するかどうかは、以下のように要素の取得時に2番目に変数「ok」等を書きます。
elem, ok = m[key]
存在すればokがtrue、しなければfalseになり、okの場合はelemに値がセットされます。
最低限の文法:ループ
forループはC言語っぽいですが、「i := 0; i < 10; i++」の部分を()で囲みません。
for i := 0; i < 10; i++ {
sum += i
}
スライスやmapの場合は、rangeで一つずつ取り出しながらループを回せます。
前にindex(key)、後ろがvalueです。
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}
for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)
}
最低限の文法:IFとswitch
if文も同様に「 x < 0」の部分を()で囲みません。
if x < 0 {
return sqrt(-x) + "i"
}
switch~case文はbreakを書かなくても、GOが自動的に補完してくれます。
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("Good morning!")
case t.Hour() < 17:
fmt.Println("Good afternoon.")
default:
fmt.Println("Good evening.")
}
最低限の文法:ポインタ
GO言語はポインタが使えます。
C言語っぽいですが、C言語と違ってポインタ演算はできないみたいです。
var p *int
i := 42
p = &i
最低限の文法:組み込み型
基本の組み込み型です。
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptrbyte // uint8 の別名
rune // int32 の別名
float32 float64
complex64 complex128
そしてゼロ値です。
数値型(int,floatなど): 0
bool型: false
string型: "" (空文字列( empty string ))スライスなど nil
とりあえず、こんくらい知ってたら、お試しプログラムはかけます。
GO言語プログラムの実行とデバッグ
プログラムを実行する方法とデバッグをお試しで確認しつつやってみます。
Hello Worldを実行
まずは「Hello World」でしょう。
作業用フォルダを作って(goworkにしました)、VSCodeでそのフォルダを開いて、ソースファイルを作り「test.go」とでも名前をつけておきます。
GO言語のソースの拡張子は「.go」です。
package main import ( "fmt" ) func main() { fmt.Print("Hello World!!") }
これを保存して「run Without Debugging」ようするに「デバッグしないで普通に実行」します。
おっと・・エラーになりました。
go: go.mod file not found in current directory or any parent directory; see 'go help modules' Build process exiting with code: 1 signal: null
go.modファイルってのがないぞ・・といってます。
最近のバージョンのGO言語では、依存関係をgo.modというファイルで管理しますので、それがないとコンパイルできません。
go.modファイルの作成は「go mod init」で行います。
go mod init に続けて、モジュール名を指定します。
うっかり、以下のように引数にソースのパスを指定してしまったりすると。
go mod init C:/gitwork/gowork
以下のようなエラーになります。
go: invalid module path "C:/gitwork/gowork": contains disallowed path separator character ':'
go.modファイルができたのを確認して、再度「run Without Debugging」をやります。
いけました。
実行時には、.vscodeフォルダに、launch.jsonが生成されました。
その内容がこちら。
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": []
}
ここは今はさわりません。
デバッグ:ブレークポイントで止める
実行できるようになったので、こんなソースでデバッグもやってみます。。
package main import ( "fmt" "runtime" ) func main() { fmt.Print("Go runs on ") switch os := runtime.GOOS; os { case "darwin": fmt.Println("OS X.") case "linux": fmt.Println("Linux.") default: fmt.Printf("%s.\n", os) } }
頭の「fmt.Print("Go runs on ")」の行を選択して、右クリックメニューで「Add BreakPoint」してブレイクポイントを設定します。
左側に「Run And Debug」ボタンがでてきます。
このボタンを押して開始します。
、バッチリ止まってます。
あとは。
- 続行:F5
- ステップオーバー:F10
- ステップイン:F11
- ステップアウト:Shift+F11
- リスタート:Ctrl+Shift+F5
- ストップ:Shift+F5
でやっていきます。
F10を何回か押すと。
ちゃんと実行して、結果も出力されてます。
とりあえず、GO言語の環境構築とインストールおよびVSCodeでGO言語を開発・デバッグする設定と動作確認はできました。
今回はこんなところで。
ではでは。
#GO