Open30

Go勉強

bayamasabayamasa

Runeを学ぶ上での前提知識
前提知識

  • code point
    code pointとはある文字コードの規格においての位置である。例えばaという文字はutf8では0x0041である。
    つまりaのunicodeにおけるcode pointは、0x0061となる。

  • 符号化形式
    コンピュータがcode pointをどのようなデータ形式に置き換えるかという規則。
    Goはutf-8を符号化形式として使用している。
    他のunicodeの符号化形式はutf-16, utf-32などがあるがこれらの違いは、8, 16, 32からわかるように対象のcode pointを何byteとして定義するかということである。
    つまりutf-8は8byte, utf-16は16byte, utf-32は32byteとなる。

例えば文字aのcode pointは0x0061のため各符号化形式で以下の様に変換される。

UTF-8 UTF-16 UTF-32
61 00 61 00 00 00 61
bayamasabayamasa

なぜUTF-16, 32ではないかというと、一文字に処理するbyte数が最小限に抑えられるからだと思われる

bayamasabayamasa

Rune
runeとは文字の単位を、1バイトとするのではなく文字を構成するバイト数(code point)とする型である。
例えばという文字はUTF-8では、16進数表記でE3 81 82で表すことができる。
つまりという文字は3バイト必要であるが、例えば1バイトずつ区切って出力してしまったりすると、意味のない16進数になってしまう。
そのため文字を出力する場合などにおいては、その文字が何バイトで構成されるのかを求めて1つの文字として出力するという変換方式が必要である。
つまりRune型はという文字をE3 81 82 = 12354と変換する。

	s := "あ"
	fmt.Println([]rune(s)) // [12354]
	fmt.Println([]byte(s)) // [227 129 130]
bayamasabayamasa

ちなみにruneはint32のエイリアスであるので、ただの数値である

bayamasabayamasa

パッケージ名をスネークケースで記述してはいけない。
もしスネークケースを使いたいと思ったときはディレクトリを切って階層を深くする

bayamasabayamasa

Goの定数はコンパイル時に値が確定してないといけない。
そのため、戻り値など値が不定になる型に対しては指定することができない

bayamasabayamasa

変数宣言 varを使うとき
structの変数を初期化するとき

bayamasabayamasa

Go json -の意味

jsonタグにおける -はparseの省略である。
これをすることにより、parseを省略する。
であれば、省略するvalueには何もjsonタグを入力しないのとなにが違うのか
https://qiita.com/nipe0324/items/55c5b51f37ce7f4679a1

bayamasabayamasa

バッククォートで囲われた文字列
raw_string_litと呼ぶ。litはiteralの略
raw_string_litはunicode_charとnewline(改行)を許容する
そのため以下のような記述が可能
msg = `
aaaa
bbbb
cccc
`

改行は\nとして解釈され、raw_string_lit内に存在する\rは廃棄される
https://go.dev/ref/spec#String_literals

bayamasabayamasa

型アサーション
Goはinterface型というすべての値を持つ型が存在する。
そのため中身がどうかとは関係なしに型を定義できてしまう。
そのためinterfaceの中に格納されている型が何かということを確定させるために、型アサーションというものが存在する
https://blog.y-yuki.net/entry/2017/05/08/000000

bayamasabayamasa

swagの定義の仕方
アノテーションがyml用のコード
Go内部の記述がGoのサーバーでローカルホスティングするときに必要なコード

// @title        test-portal
// @version      1.0
// @host         localhost:1323
// @BasePath     /v1
// @schemes      http https
func API()  {
	spec.SwaggerInfo.Title = "test-portal"
	spec.SwaggerInfo.Version = "1.0"
	spec.SwaggerInfo.Host = "localhost:1323"
	spec.SwaggerInfo.BasePath = "/v1"
	spec.SwaggerInfo.Schemes = []string{"http", "https"}
bayamasabayamasa

Go http.Server型
GoではGraceful shutdownを実装するために自作http.Server型をつかって実装をする場合が多い