2019/09/23

V言語を試してみたらGoが気になったのでやってみた

Hugoは使ったことがあるが……

Goに関しては、過去に静的サイトジェネレータでおなじみHugoを使って、Netlifyで公開ということはやったことはありますが、Go自体はふわっと見た程度でしたので、これを機に少し試してみようかと思いました。ちなみにV言語はどうも正常に動作しないようなので(私だけかもしれない)、とりあえず様子見ということにしました。Nimもまたversion1.0のリリースまで現在様子見です。

さて早速インストールですが、Manjaroのパッケージマネジャーでは最新版ではなかったので、ソースファイルをダウンロードして行いました。goというディレクトリを作ってそこにgo1.13.linux-amd64.tar.gzをダウンロードし、展開。PATHを通す。

export PATH=$PATH:$HOME/go/go/bin
go/go/binと名前的に変な感じになったが、気にせず進む。
これで完了。

$ go version
go version go1.13 linux/amd64
さっそくHello, world!!をやってみる

/*
    File: hello.go
*/

package main

import "fmt"

func main() {
    fmt.Printf("Hello, world!!\n")
    fmt.Println("Hello, world!!")
}

packageは名前空間を区別するためのもの。C言語と違い、セミコロンは要らないようだ。変数はどんな感じか。

var x int = 0
//もしくは
x := 0

// Pointer
var p *int
p = &x
fmt.Println(*p)
:=は局所変数を宣言する際に使うもののようだ。ポインタはC言語と同じ感じ。構造体はどうだろうか。

package main

import "fmt"

type Person struct {
    Name string
    Age int
}

func (p *Person) Birthday() {
    p.Age += 1
}

func main() {
    tom := Person {Name: "Tom", Age: 25}
    tom.Birthday()
    fmt.Println(tom)
}

気をつけるべき点があるようで、大文字で始まるものはpublic、小文字のものはprivateといった命名規則があるようです。これは私的には明示的にpubとつけるRustのほうが好きですが。
enumあたりはどうだろうか。と調べてみると、Goには無いらしい。その代わり、以下のやり方で似たようなことが可能らしい。

package main

import "fmt"

type Color int

const (
 Red Color = iota
 Blue
 Green
)

func main() {
 fmt.Println(Red, Blue, Green)  // 0 1 2
}
iotaconst内で使用できるものらしい。これによって、型なしの連続する整数定義を表すとのこと。Rustのenumに慣れると他のenumでは物足りなさを感じる。が、この言語はこういう仕様ということで割り切って使う。

まとめ

とりあえずさらっと触れた感想としては、まだまだ基本的な部分だけですが、割とすんなり入ってきたので、Pythonに寄ったC言語という印象を持ちました。従いまして、PythonからGoに移行するといったこともあり得ることだな、と思いました。