"BOKU"のITな日常

興味のむくまま気の向くままに調べたり・まとめたりしてます。

GO言語(golang)のインストール・開発環境構築・実行&デバッグ

f:id:arakan_no_boku:20210412005751p:plain

目次

GO言語に興味を持った理由

この記事で、GO言語(golang)に興味がわきました。

liginc.co.jp

PHP5.6の82倍!、PHP7の30倍!というGO言語の圧倒的な速度は魅力です。f:id:arakan_no_boku:20210410001045p:plain

インストール 

こちらのサイトからWindowsインストーラをダウンロードして実行します。

インストールに悩むところは、ないと思います。

golang.org

環境変数の設定とかもインストーラが面倒見てくれてるみたいなので、特に追加設定はせず、コマンドプロンプト(CMD)で以下を実行して動作確認します。

go version

f:id:arakan_no_boku:20210408001410p:plain

開発環境

開発にはVSCodeVisual Studio Code)を使います。

VSCodeVisual Studio Code)のインストールがまだなら、以下のサイトからインストーラをダウンロードして、VSCodeのインストールを先に行います。

code.visualstudio.com

VSCodeがインストールされたPCで、以下のWEBページを開き「innstall」ボタンを押し、表示されるダイアログで「continue」します。

marketplace.visualstudio.com

f:id:arakan_no_boku:20210410002316p:plain

VSCodeが立ち上がってくるので、VSCode上で再度「install」ボタンを押します。

インストールできたら、VSCodeで「Ctrl+Shift+p」を押しコマンドパレットを表示して、以下を入力して実行します。

Go: Install/Update Tools

インストールするか聞いてきます。

「install All」を選んで以下のモジュールをすべてインストールします。

f:id:arakan_no_boku:20210410003918p:plain

最後に「you are ready to Go」が表示されたら完了です。

f:id:arakan_no_boku:20210410003704p:plain

これで開発環境設定は終わりで、デバッグも可能になっています。

 

次に「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 uintptr

byte // uint8 の別名

rune // int32 の別名

float32 float64

complex64 complex128

そしてゼロ値です。

数値型(int,floatなど): 0
bool型: false
string型: "" (空文字列( empty string ))

スライスなど nil

とりあえず、こんくらい知ってたら、お試しプログラムはかけます。 

簡単なプログラムを実行

まずは「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」をやります。

f:id:arakan_no_boku:20210410145132p:plain

いけました。

実行時には、.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」ボタンがでてきます。

f:id:arakan_no_boku:20210410150035p:plain

このボタンを押して開始します。

f:id:arakan_no_boku:20210410150327p:plain

、バッチリ止まってます。

あとは。

  • 続行:F5
  • ステップオーバー:F10
  • ステップイン:F11
  • ステップアウト:Shift+F11
  • リスタート:Ctrl+Shift+F5
  • ストップ:Shift+F5

でやっていきます。

F10を何回か押すと。

ちゃんと実行して、結果も出力されてます。

f:id:arakan_no_boku:20210410150747p:plain

とりあえず、GO言語の環境構築とインストールおよびVSCodeでGO言語を開発・デバッグする設定と動作確認はできました。

今回はこんなところで。

ではでは。

#GO