本記事は、プログラミング言語Goを読みながらgolangの基礎知識についてメモしていく記事です。

Goの型

Goの型は4つ に分類される

  • 基本型(basic type)
    • 数値、文字列、ブーリアン
  • 合成型(aggregate type)
    • 配列、構造体
  • 参照型(reference type)
    • ポインタ、スライス、マップ、チャネル、関数(プログラムの変数あるいは状態を間接的に参照する)
  • インタフェース型(interface type)

整数

  • 整数算術

    • int(32or64bit)
    • int8,int16,int32,int64
  • 符号なし整数算術(0と正の数のみを表現)

    • uint(32or64bit)
    • uint8,uint16,uint32,uint64
  • rune型

    • int32に対するシノニムで、慣習的にUnicodeのコードポイントであることを示す
  • byte型

    • uint8に対するシノニムで、慣習的に数値量ではなく生データであることを示す
  • uintptr型

    • CライブラリやOSと、Goプログラムがやり取りする境界部分などの低レベルプログラミングだけで使われる
  • オーバーフロー(overflow)

    • 算術演算の結果が結果の型で表現可能なビット数よりも大きくなった
    • 型に収まらない上位ビットは黙って破棄される

浮動小数点

https://www.macnica.co.jp/business/semiconductor/articles/intel/133327/ http://aoki2.si.gunma-u.ac.jp/Hanasi/StatTalk/fudoushousuu.html

1.6777216e+07
# 1.677216の10の7乗
  • float32,float64
    • float32は6桁の10進数の精度レベル、float64を使っておけば問題ない
	var e float64 = 2.7218
	var g float64 = 1.1234e4
	fmt.Println(e) //2.7128
	fmt.Println(g) //11234

複素数

  • complexc64とcomplex128
    • complex()で複素数を生成
	var x complex128 = complex(1, 2)
	fmt.Println(x) //(1+2i)

ブーリアン

  • true/falseしかない

文字列

  • 文字列とは、不変なバイト列
  • len()は文字列中のバイト数を返す
    • つまり、文字列のn番目のバイトは必ずしもn番目の文字(character)ではない
  • 部分文字列(substring)であるs[0:5]は、元のバイト列のインデックスiからj-1までのバイトからなる新たな文字列を生成する
  • 文字列リテラル(string literal):ダブルクォートで囲んだ場合
  • 生文字列リテラル(raw string literal):バッククォートで囲んだ場合
    • エスケープシーケンスは処理されない
    • 改行をいれられる

文字列とバイトスライス

  • 文字列を操作するには4つの標準パッケージが重要
    • bytes,strings,strconv,unicode
      • bytes:[]byte型(バイト型のスライス)を操作する為の関数を提供
        • 文字列は不変なので、文字列を少しずつ増やしながら構築するみたいな処理は、メモリ割当とコピーが大量に走る
        • このような場合は、bytes.Buffer型を使うのがより効率的
      • strconv:booleanや整数値を文字列表現に変換・逆変換する
        • fmt.Sprintfstrconv.Itoa
      • unicode:rune(Unicodeのコードポイント値の型)を分類・変換する為の関数(これは大文字なのか?みたいな)を提供
  • pathとpath/filepathパッケージ
    • path:URLのパス要素のような領域のパスを操作
    • path/filepath:UNIXのパスやWindowsのパスを操作
  • 文字列は一旦生成されると不変だが、バイトスライスの要素は自由に修正できる(バイトスライスを使う理由、メモリ効率)
	s := "abc"
	b := []byte(s)
	fmt.Println(b) //[97 98 99]
	s2 := string(b)
	fmt.Println(s2) //abc
  • []byte(s)は、sのバイトのコピーを保持する新たなバイト配列を割り当てて、その配列全体を参照するスライスを生成する
  • string(b)も、文字列s2の普遍性を保証する為のコピーをおこなう

Buffer型

  • bytesパッケージが、バイトスライスを効率的に操作するために提供する型
    • Bufferは空から始まり、string,byte,[]byteなどのデータ型が書き込まれるごとに大きくなる
    • bytes.Bufferはゼロ値で使用可能なので、初期化は不要

定数

定数とは、コンパイラが値をわかっていて、実行時ではなくてコンパイル時に評価が行われることが保証されている式

const (
  a = "A"
  b = "B"
)

定数宣言iota

明示的に毎回書くことなく関連した値の列を生成する為に使う https://qiita.com/curepine/items/2ae2f6504f0d28016411