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)
}

値変換

strintなら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
 

Goのruneを理解するためのUnicode知識 - Qiita
Go の rune 型を試してみる - Qiita