Go勉強
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 |
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]
パッケージインストーラーaqua
go build の tagsオプション
CGO_ENABLEがあれば、-a -suffixみたいなやつは必要内っぽい
validator translationの中身
パッケージ名をスネークケースで記述してはいけない。
もしスネークケースを使いたいと思ったときはディレクトリを切って階層を深くする
Goの定数はコンパイル時に値が確定してないといけない。
そのため、戻り値など値が不定になる型に対しては指定することができない
go getは1.18からは廃止されたそう
go installとかするときのxはeXternal
の略で、要は標準ライブラリではなく外部ライブラリにした部分という意味。
標準であればimportなしでgolang.orgからinstallするパッケージはexternalである
変数宣言 varを使うとき
structの変数を初期化するとき
Go json -
の意味
jsonタグにおける -
はparseの省略である。
これをすることにより、parseを省略する。
であれば、省略するvalueには何もjsonタグを入力しないのとなにが違うのか
デフォルトによるencoding形式はここに記載されていそう。
一定のルールでencodeされているのがわかる
Go
sql injectionを回避するにはprintfを使わないようにするだけでよさそう
なぜそれで回避できるかはまた調べる
そもそもplaceholderはmysqlの標準使用っぽい
なので、どの言語でもdriverの実装を呼び出せば良い感じになる
バッククォートで囲われた文字列
raw_string_litと呼ぶ。litはiteralの略
raw_string_litはunicode_charとnewline(改行)を許容する
そのため以下のような記述が可能
msg = `
aaaa
bbbb
cccc
`
改行は\n
として解釈され、raw_string_lit内に存在する\r
は廃棄される
ちなみにcat -eで出てきた、^Mの解説
envconfigのsplit_words
環境変数のスネークケースとGoのキャメルケースをいい感じに統合してくれる
型アサーション
Goはinterface型というすべての値を持つ型が存在する。
そのため中身がどうかとは関係なしに型を定義できてしまう。
そのためinterfaceの中に格納されている型が何かということを確定させるために、型アサーションというものが存在する
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"}
Go http.Server型
GoではGraceful shutdownを実装するために自作http.Server型をつかって実装をする場合が多い