以前にGolangに入門したはずでは?
『Get Programming with Go』の翻訳『入門 Goプログラミング』を買った。 時間がちょっとあるのでGolangでも勉強しておくか、と思ったのと、原著がManningだからまあ大丈夫だろう、という甘い考えに基づいて勉強を始めた。
勉強もとい写経した記録はGitHubにまとめている。
ひとまず、Go言語で気になった点を雑にまとめておく。 僕はPythonの経験が長いのでPythonとの比較が多いが、それ以上の意味はないので、どちらの言語が優れているのかという話をしたいわけではない。
fmt
がモジュールとして切り出されているのはなぜか
実装するプログラムの都合上、毎回fmt
モジュールをインポートしている。
I/Oはよく使うが特殊なもの(OSが絡む)ので、別枠にしているのはわかるのであるが、面倒である。
math/rand
の乱数シード
Pythonのrandom
はインポートすると乱数シードもよしなに設定されるが、Goのmath/rand
は設定されない(ビルド時にキャッシュされる?)。
Pythonのrandom
含め認識が間違っている可能性が大いにあるが、気を付けないといけないなと感じた。
string
型をイテレートすると何が起きるか
次のコードはLesson 11のヴィジュネル暗号の実装である。
package main import ( "fmt" "strings" ) func charToDiff2(c byte) int { return int(c - 'A') } func shiftToRight(c byte, d int) byte { if c >= 'A' && c <= 'Z' { c += byte(d) if c > 'Z' { c -= 26 } } return c } func main() { plainText := "your message goes here" keyword := "GOLANG" plainText = strings.Replace(plainText, " ", "", -1) plainText = strings.ToUpper(plainText) for i := 0; i < len(plainText); i++ { j := i % len(keyword) fmt.Printf("%c", shiftToRight(plainText[i], charToDiff2(keyword[j]))) } fmt.Println("") }
string
型をインデックスで取得するとstring
ではなくbyte
型となる。
以前にRustをかじった際にも感じたが、型がしっかりしている言語は文字列の扱いが難しい。
関数とメソッド
型にメソッドを紐づける仕組みは面白いなと思ったが、型とメソッドの実装が一見して結びつかないのでIDEの助けがないと面倒くさそうだなと思った。 別にクラスとメソッドでもIDEの助けがないとわからないが、Pythonだとインデントの関係で視覚的にもわかりやすい、かもしれない。