bam6o0の記憶域

忘備録になればいいな

Go言語の勉強記録8bit

条件分岐

  • if文とswitch文がある

if文

  • 処理の分岐に使う。
  • 書式
if 条件式{
  //処理
}else{
  //処理
}
  • else文は必須ではない
  • else ifは使用可能

実行結果

 $go run if.go
0 が偶数
1 は奇数
2 が偶数
3 は奇数
4 が偶数
  • if文の条件式の前に文を記述可能
  • 条件式の前にで区切って文を記述できる。
  • 省略書式を使った変数宣言などができる。
if x,y := hoge(i); x < y {
  fmt,Println(x, "<", y)
}else if x > y {
  fmt.Println(x, ">" y)
}else {
  fmt.Println(x, "=", y)
}

switch文

  • 処理の分岐
  • ifとの違いは複数の分岐を一度に記述できること
  • Goには型switchと式switchの2種類ある
  • Cのswitchに相当するのは式switch
  • 書式
switch 式{
case 式:
  //switch式の評価結果とcase説の式の評価結果一致している時の処理
case 式:
  //switch式の評価結果とcase説の式の評価結果一致している時の処理
default:
  //どのcase説にも一致しない時の処理
}

実行結果

$go run switch.go
0
1または2
1または2
その他
その他
  • case文は,で区切ると複数の式を記述可能
  • 複数の式のときはどれかが一致すれば処理実行
  • break文は不要
  • break文を明示的に記述することも可能
  • 下のcase文を実行したい時はfallthrough文を使う
  • fallthrough文はcase節の最後にしか記述できない。

実行結果

$go run fallthrough.go
Sunday 休日
Monday たぶん平日
Tuesday たぶん平日
Wednesday たぶん平日
Thursday たぶん平日
Friday たぶん平日
Saturday 休日
  • case節に式では数値、文字列、論理値など
  • switch文の式の評価結果 == case節の式の評価結果のとき実行
  • switch文の式を論理値turuに設定すればcase節の式には条件式が記述可能
  • switch文の式のtrueは省略可能
switch {
case:
case:
default:
}

Go言語の勉強記録7bit

繰り返し処理

  • Go言語のでループ分はforのみでwhile文はない

for文

  • for文の書式
for 初期条件;条件式;後処理文{
  //処理
}

実行結果

$go run for.go
0
1
2
3
4
  • 初期化条件は省略文可能
  • 他の文を記述することも可能
  • 条件式はtrue中処理され、falseになったら終わる。
  • 初期化分と後処理文は不要であればセミコロンだけで記述可能
for ;i<5; {
   ///処理
}

while文相当

  • for文と条件式のみ記述してwhile文をつくれる。
for 条件式{
  ///処理
}

実行結果

$go run condition.go
0
1
2
3

無限ループ

  • for文のキーワードだけ記述すると無限ループ
for{
  //処理
}

実行結果

$go run infinity.go
0
1
2
3
4

range式を使用する書式

  • for文でrange式を使用すると配列などの値から要素を1つずつ取り出してループできる。
  • 書式
for 変数 := range 要素を取り出す値{
  //このブロックの処理が繰り返される
}

実行結果

$go run range.go
0
1
2
3
4
  • range式で使用できる値は、型が配列・スライス・文字列。マップ・チャンネル
  • range式に文字列を与えた時は、文字列内の文字数ループ

実行結果

$go run range_string.go
0 97
1 98
2 99
3 12354
6 12356
9 12358
  • 文字列をrange式に与えた時、返される一番目の型は文字列内のバイトインデックス(int
  • 文字列をrange式に与えた時、返される二番目の型はUnicodeコードポイント(rune)
  • a,b,cは1バイト、あ、い、うは3バイト消費であるため、インデックスは連続した値にならない。

break文

  • 強制的にブロック内からループ文を抜ける処理

実行結果

$go run break.go
0
1
2

continue文

  • ループ処理ブロック内の以降の処理をスキップする処理
  • ループの条件式の判定に強制的に戻る

実行結果

$go run continue.go
0
2
4

Go言語の勉強記録6bit

パッケージ

  • Goはソースファイルがパッケージ単位でグルーピングされる
  • パッケージには1つ以上のソースファイルが所属
  • 同一パッケージに所属している別のソースファイル内で宣言された定数、型、変数、関数といった識別子はアクセス可能
  • 関数内で宣言されたローカルな識別子にはアクセスできない。
  • パッケージ名はすべて小文字かつ単語ひとつからなることが推奨

エクスポート

  • パッケージ外で宣言された識別子にアクセスする方法
  • 識別子にパッケージ外からのアクセスを許可すること
  • エクスポートしたい識別子は先頭1文字をアルファベット大文字にする
  • ローカルな識別子はエクスポートされない

インポート

  • 他のパッケージでエクスポート宣言されている識別子を使用する方法
  • 最初に宣言されているパッケージをインポート宣言する必要がある。
  • インポート宣言はimport+パッケージのパス
  • パッケージのパスは文字列よりダブルクォート""で囲む
  • fmtパッケージはGo言語の標準ライブラリ
  • 時差いいのライブラリはGo言語をインストールしたディレクトリ下のpkg/~/fmt.aファイル
  • .a拡張子はライブラリファイルであることを表す。
  • インポートしたパッケージの識別子はパッケージ名.識別子名でアクセス可能
  • インポートしたパッケージにアクセスする際に使用する識別子は、指定しない場合パッケージ名になる。
  • 名前を変更したい場合はimport 識別子 "パッケージンのパス"

実行結果

$go run import.go
fmtパッケージの名前をformatに変更
  • インポート宣言したパッケージは使わないとコンパイルエラー
  • ブランク識別子を使えばエラー回避可能
import _ "パッケージのパス"

独自のパッケージを使用する

  • ソースファイルを特定のディレクトリに格納する必要がある。
  • my/sampleパッケージを作成し、そのパッケージに属するtest.goソースファイルを格納する場合
    mylibrary(任意のディレクトリ)
     └src
      └my
       └sample
         └test.go

  • ディレクトリツリー最上位パス(上記mylibrary)をドライブレターを含め、フルパスで環境変数GOPATHに登録する必要がある。

  • test.go内のpackage宣言
package sample //最下位のパッケージ名だけ記述
  • このmy/sampleパッケージのインポート
import "my/sample"

Go言語の勉強記録5bit

変数宣言

  • 基本はvar+変数名+
  • 初期値が与えられている場合は型の宣言を省略可能
  • 変数名 := 初期値varを省略可能

リテラル

  • リテラルとは値をプログラムコード内に記述するための表記法
  • 定数を記述するために使用
  • 値の種類によって書き方が異なる
  • C言語とほぼ一緒
  • 複素数がある
c := complex(1,2) //実数部が1、虚数部が2
  • リーンリテラル(文字リテラル)はシングルクォートで囲む
  • その文字はUnicodeコードポイントに応じて整数値を表す
  • 文字列リテラルはダブルクォートまたはバッククォートで囲む

定数宣言

  • 定数とはプログラム内で値を変更できない値
  • 定数となりうるのは数値・文字列・論理値
  • 宣言方法はconst+定数名+ = 値または式
  • 型は省略可能
  • 定数列挙には定数宣言をグルーピング化しiota列挙子を使うと便利
  • グループ内の先頭ではiotaは0を返す
  • 呼び出されるたびに1つずつ増える。
  • グループが変わればまた0にリセットされる。

実行結果

$go run iota.go
0 1 2 3 4
0 1 2 3 4
1 2 4
  • 定数宣言をグルーピングしたときは2番目以降の値は省略できる
  • iota列挙子は式の中でも使用可能

Go言語の勉強記録4bit

演算子

C言語とほとんど一緒のため割愛

  • シフト演算子以外は演算対象の2つの型は一致しなければならない
  • 型を宣言しなかった定数constの場合、使用する箇所の文脈によって型がきまる。
  • インクリメント++とデクリメント--はGoでは演算子ではなく文
  • 文は単独でしか使えず、代入文や関数呼び出しパラメータに使用できない。

代入

C言語とほとんど一緒

  • ,で区切れば複数に代入可能
  • Goの関数は複数の値を戻り値として返せるため、複数の戻り値を受けるときも,で区切る
a = 12345
b = 3*2
c,d = 3.14,"abc"
e,f = fn()

ブランク識別子

  • _アンダースコアはブランク識別子という特殊な識別子として認識される。
  • 変数同様に値を代入できるが、そこから値を取得できない。
  • Goは使用しない変数を宣言するとコンパイルエラー
  • 回避するためにブランク識別子を使う。
  • 特に関数の戻り値の1つを使わない時に有用
//戻り値2つだがa,bともにプログラム上で使わないとエラー
a,b = fn()
//aのみ使う場合はブランク識別子に2つめの戻り値を代入する。
a,_ = fn()

Go言語の勉強記録3bit

基本的な型

  • Goにはクラスはなく型しかない。
  • 型は値だけではなくメソッドも持てる

論理値型

実行結果

$go run bool.go
true
  • 論理値を格納する変数はbool
  • リテラル定数trueまたはfalse
  • 変数宣言はvar変数名

数値型

実行結果

$go run number.go
12345
  • 数値を格納する変数は数値型を使用する。
  • Goではポインタの値は計算できない。

文字列型

実行結果

$go run string.go
あいう
  • 文字列を格納する変数にはstring型を使用する。
  • ++=で結合可能

文字列の長さを取得する

実行結果

$go run string_len.go
golang len 6
Go言語 len 8
  • 文字列はUTF-8エンコードされたbyte配列のように振る舞う
  • 配列と同様にlen()関数で長さを取得可能
  • インデックスを使ったアクセスも可能
  • UTF-8はマルチバイトより英語は1byteだが日本語は複数byte使用
  • len()が返すのは文字数ではなくバイト長

文字数のカウント

実行結果

$go run string_count.go
Go言語 len 4
  • 正しく文字数をカウントするにはunicode/utf8パッケージのRuneCountInString関数を使用
  • RuneとはUnicode文字のこと

型の宣言

実行結果

$go run type.go
124
  • 型を宣言することで新しい型を作成できる
  • C言語でのtyoedef
  • 宣言はtype+型名+基になる型

型の変換

実行結果

$go run convert.go
1234
1234
Ӓ
[211 146]
  • 値の型を他の型に変更する
  • 明示的に変換しないと整数型同士であっても代入や比較はできない。
  • 変換は変換先の型(変換する値)
  • 型名が演算子で始まるときは型名を()で囲む

Go言語の勉強記録2bit

gistc3d0452d9a762ef466ea1c79b06b3e0c

package main

  • Goのソースファイルは必ずpackage文で始まる。
  • ソースファイルはパッケージという単位でグルーピングされる。
  • 各パッケージには1つ以上おソースファイルが所属する。
  • hello.goファイルがmainパッケージに属することを指定している。

import “fmt”

  • 他のパッケージ内でエクスポートされている型や関数をこのソースファイル内で使用する宣言

func main(){~}

  • func文は関数の宣言
  • mainは関数名
  • mainは特別な関数
  • mainは実行時に最初に呼び出される関数
  • 外部のパッケージの関数呼び出しはパッケージ名と関数名の間に.を入れる
  • fmt.Printlnは標準出力

全体

  • 文末セミコロンは省略可能(例外あり)
  • 1つの行に2つの文のときは明示的にセミコロンを入れる。
  • 関数宣言{}の置き場はfuncと同じ行。
  • コメントアウト//または/*~*/

おまけ

ソースコード整形コマンド

$go fmt file