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
}
iota
はconst
内で使用できるものらしい。これによって、型なしの連続する整数定義を表すとのこと。Rustのenumに慣れると他のenumでは物足りなさを感じる。が、この言語はこういう仕様ということで割り切って使う。