up:: Programming
Rustと並び立つ有名言語。
Googleが管理しているのでRustより安心感がある。
var name string
のように変数を宣言できるが、name := "str"
で直接型推論しながら変数宣言できるのが特徴。
名づけ慣習
頭小文字はprivate変数、大文字はpublic変数。
2単語以上はキャメルケース。
package
はそのファイルのコード自体に名前をつけてるっぽい?
出力
fmt.Println()
。python2っぽいfmt.Printf()
もある。
Printfは%
と文字でいろいろ事前フォーマット可能。%v
で直接か%s
で文字列が使いやすそう。%T
で型が出せる。
fmt.Printfなんかこわくない Go - Qiita
標準入力
bufio.NewScanner
でos.Stdinを拾える変数を用意、.Scan()で入力を読む。
スキャン結果は.Text()で取得。
package main
import (
"fmt"
"bufio"
"os"
)
func main() {
sc := bufio.NewScanner(os.Stdin)
sc.Scan()
name := sc.Text()
fmt.Println("Hello " + name)
}
値変換
str→intならstrconv.Atoi(str)
で変換。戻り値は(int,error)なのでv, _ := strconv.Atoi(str)
などで対処。
反対はstrconv.Itoa(int)
。
他のstr→値はstrconv.ParseFloat(str,size)
など。逆はstrconv.FormatFloat(float, byte, precision, size)
など。
【Golang】文字列と数値の変換(strconv) Go - Qiita
strconv package - strconv - Go Packages
if
pythonぽいが、{}
で囲む。おわり。
三項演算
ない。ifで地道に割る。
複雑になりすぎるかららしい。
Goに三項演算子が採用されない理由
flag
コマンドライン引数を解析するライブラリ。
import “flag”
引数を入れる変数を定義→
関数に変数ポインタ渡してバインド→
解析(代入)
という流れ。
定義とバインドは同時に行えるが、そうするとポインタが返されるので*
を使い実数値を取得することになる。
type
typeはElmでいうカスタム型。
Goを学びたての人が誤解しがちなtypeと構造体について golang Go - Qiita
シングルクォーテーション
文字列はダブルクォーテーションのみ。
シングルクォーテーションはrune型になる。
rune型はint32のエイリアス。
文字を入れると対応するUnicodeの値、code pointの10進数を返す。
この性質上、マルチバイト文字を1文字として認識するのに使える。
というか標準のsliceとかlenとかマルチバイト文字を扱わないので日本語圏なら必須では。
s := "Gopherはかわいい"
fmt.Println(len(s)) // 21
fmt.Println(len([]rune(s))) // 11
fmt.Println(utf8.RuneCountInString(s)) // 11
s := "Gopherはかわいい"
fmt.Println(s[0:7]) // Gopher�
fmt.Println(string([]rune(s)[0:7])) // Gopherは
s := "Gopherはかわいい"
byteIdx := strings.IndexRune(s, 'か') // 9
runeIdx := len([]rune(s[0:byteIdx])) + 1 // 8