何かを書き留める何か

数学や読んだ本について書く何かです。最近は社会人として生き残りの術を学ぶ日々です。

『入門 Goプログラミング』読書メモ

以前にGolangに入門したはずでは?

Get Programming with Go』の翻訳『入門 Goプログラミング』を買った。 時間がちょっとあるのでGolangでも勉強しておくか、と思ったのと、原著がManningだからまあ大丈夫だろう、という甘い考えに基づいて勉強を始めた。

勉強もとい写経した記録はGitHubにまとめている。

github.com

ひとまず、Go言語で気になった点を雑にまとめておく。 僕はPythonの経験が長いのでPythonとの比較が多いが、それ以上の意味はないので、どちらの言語が優れているのかという話をしたいわけではない。

fmt がモジュールとして切り出されているのはなぜか

実装するプログラムの都合上、毎回fmtモジュールをインポートしている。 I/Oはよく使うが特殊なもの(OSが絡む)ので、別枠にしているのはわかるのであるが、面倒である。

math/rand の乱数シード

Pythonrandomはインポートすると乱数シードもよしなに設定されるが、Goのmath/randは設定されない(ビルド時にキャッシュされる?)。 Pythonrandom含め認識が間違っている可能性が大いにあるが、気を付けないといけないなと感じた。

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だとインデントの関係で視覚的にもわかりやすい、かもしれない。