- 投稿日:2021-03-29T19:36:25+09:00
プログラミング超入門(8)〜GO言語〜
switch文
switch文は、変数の値を「case」で始まる文で評価して条件が満たされれば特定の処理を行います。一度でも条件が満たされれば再び評価はしません。条件が満たされなかった場合は何もせずに終わります。複数の「case文」を用いて場合分けをし、値を示させます。switch文の後に変数名を記述し、どの変数の値について「スイッチ」させるか決めます。
switch.gopackage main import "fmt" func main() { pushs := []string{"S", "N", "R", "C", "E"} for i := 0; i < len(pushs); i++ { switch pushs[i] { case "R": fmt.Printf("[%s] 実行します。 \n", pushs[i]) case "S": fmt.Printf("[%s] ファイルを保存します。 \n", pushs[i]) case "N": fmt.Printf("[%s] 次に進みます。 \n", pushs[i]) case "E": fmt.Printf("[%s] 終了します \n", pushs[i]) default: fmt.Printf("[%s] 最初からやり直して下さい。 \n", pushs[i]) } } }実行結果
[S] ファイルを保存します。 [N] 次に進みます。 [R] 実行します。 [C] 最初からやり直して下さい。 [E] 終了しますcase文は値を示すだけです。switch文は全体を{ }で囲みますが、case文は囲む必要ありません。case文はいくらでも書くことができますが、default文を持って終了します。
式の値で場合分け
case文で数値の大小関係を評価してみましょう。スライスを用いて病院内で感染してしまった患者さんを年齢別に集計するプログラムを作成してみます。
cluster.gopackage main import "fmt" func main() { age := []int{19, 21, 23, 48, 36, 26, 33, 39, 67, 31, 55} clus := [4]int{} patient := true for i := 0; i < len(age); i++ { switch patient { case age[i] > 59: clus[3]++ case age[i] > 49: clus[2]++ case age[i] > 29: clus[1]++ default: clus[0]++ } } fmt.Printf("院内感染者%d名のうち : \n", len(age)) fmt.Printf("60代以上は%d名\n", clus[3]) fmt.Printf("50-60代は%d名\n", clus[2]) fmt.Printf("30-40代以は%d名\n", clus[1]) fmt.Printf("30代以下は%d名\n", clus[0]) }実行結果
院内感染者11名のうち : 60代以上は1名 50-60代は1名 30-40代以は5名 30代以下は4名switch文で評価する変数patientにブール型である固定値trueが代入してあります。clusが見ている配列から要素を取り出してswitch文を評価する度、case文の内容が変わります。GO言語のswitch文は、前に書いてある条件に合致して処理されたら、次の条件に合致しても無視されるので、式の値がtrueかfalseかで場合分けする場合はpatientのような変数を以下のように省略して書きます。
switch { case age[i] > 59: case age[i] > 49: case age[i] > 29: default: }配列clusを作成して、値が整数0である要素を4つ自動で作成しています。この配列からは、要素clus[0],clus[1],clus[2],clus[3]の値を操作できます。それぞれの要素を「60歳以上の人数」「50歳以上の人数」「30歳以上の人数」「それ以外の年代の人数」として、for文の中のswitch文が書かれています。
for文とswitch文を組合せコードを綺麗に
caseの条件に当てはまらなければ何もせず次の繰り返しに進むことができるのでそれを利用し、コードをすっきりまとめ上げます。
forswitch.gopackage main import "fmt" func main() { then := 6789 fmt.Println(then) for n := 0; n < then; n++ { switch { case n == 0: case n == 1: case then%n == 0: then /= n fmt.Printf("を%dで割ると、 %d\n", n, then) default: } } }実行結果
6789 を3で割ると、 2263 を31で割ると、 73nが0と1のときは何もせず、ただnを増やすだけなので、0で除算するリスクを避け条件の書き方を簡単にします。
- 投稿日:2021-03-29T02:09:38+09:00
Golang 入門 #1
Golangとは
公式ドキュメント に書いてあることをまとめると、Golangとは...
- オープンソース
- シンプルな言語仕様
- 並行プログラミングに強い
- コンパイル型言語
- コンパイルや実行が速い
2021年3月の時点でGolangの最新バージョンは 1.16
Go1.16 は、macOS 10.12 Sierraで実行される最後のリリースになっており、Go1.17 ではmacOS 10.13 HighSierra以降が必要になる。Goの需要
まず国内におけるGoの需要はどうだろうか
TECH Street(テックストリート)によるアンケートの調査結果は次の通り
Goは国内における需要は増えているという話は聞きますが、Perlと同じ15位にランクイン
引用元) ITエンジニアが 2021年に学びたい(強化したい)プログラミング言語ランキングでは国外、ワールドワイドでのGoの需要はどうだろうか
PYPLの2021年3月時点での去年と比較したランキングは次の通り
去年から伸びてなくね?
引用元) PYPL PopularitY of Programming LanguageGo大丈夫なのか
:
:
安心してください
同じくPYPLが公表している人気言語ランキングでは、ついにRubyとも逆転し、他の言語が下がる中Goは確実に伸びていることがわかります。
これで安心して、Goを勉強できますね!
最初に手をつけたところ
どの言語にも言えますが、まずは言語の特徴を知るところから始めます。
はじめてのGo
技術評論社の開発者向けGo特集の記事、Go1.3にフォーカスしているので少し古いですが基本となる学習に関しては問題ありません。
各章では次の内容がソースコード付きでわかりやすく説明されています。
- 第1章では「Go言語の特徴と環境構築」について
- 第2章では、Goの特徴である「シンプルな言語仕様や型システム」について
- 第3章では「構造体やインターフェース」について
- 第4章では、標準パッケージで「JSON、ファイル、HTTP、HTML」を扱う
- 第5章では、スレッド「ゴルーチン(Goroutine)」、並行実行されるごルーチン間でデータのやり取りをおこなう「チャネル(channel)」について
A Tour of Go
A Tour of Goを日本語訳したものです。変数の宣言方法や関数の呼び出し方、基本となる言語構造から、メソッドやインターフェース、Goの特徴である「ゴルーチン(Goroutine)」と「チャネル(channel)」について学ぶことができます。
ただし、丁寧に書かれているわけではないので、初学者向けではなかったのかもしれません。Go Web プログラミング
Go言語の基礎 〜 Webアプリケーションに対する実装例をコードを添えて解説してくれています。またセキュリティから暗号化など幅広く、もしGoでWebアプリケーションを開発することを考えているなら、このサイトは見ておくべきです。
シンプルな言語仕様や型システム
Goは次が基本となっています
- セミコロンなし
- try-catchがサポートされていない
変数
Goは変数を
var
で定義します// Goでは型を変数の後に置きます。ここでは string型の text という変数を宣言しています。 var text string // 複数の変数も定義できます。 var text1, text2 string変数の初期化は次の通りです
// 宣言した型の後に初期化します var text string = "message" // 複数の変数を同時に初期化できます var text1, text2 string = "message1", "message2"Goでは短縮宣言
:=
も用意されています// := の記号は var と 型 に変わるものです。 text1, text2 := "message1", "message2"ただし短縮宣言は関数の内部でしか使用できません。関数の外から使おうとするとコンパイルが通らなくなります。そのため、一般的には
var
をグローバル変数として定義します。定数
いわゆる定数、オワリ
// 他の言語と似たような宣言方法 const name = "keyword" // 型を明示できます const name string = "keyword"型
Boolean型
// デフォルトは false var isBool = true整数型と小数型
// 整数、Goは int 以外にも uint もサポートしています。 var x int = 1 // 小数、float型はないです、float32とfloat64の二種類で、デフォルトはfloat64 var y float64 = 1.234文字列型
// Goの文字列はすべてUTF-8 var text = "message" // バッククォートを使うと\rや\nなど、改行コードを含めることが出来ます var text = `message`エラー型
// 他の言語でいうと Exception に近いですかね err := errors.New("エラー")グループ化
// 複数の型違いの変数を同時に定義 var ( c int d string ) // 定数も同じくグループ化できます const( i := 100 pi := 3.1415 )配列型
// int型の配列 var arr [10]int // 要素は 0 からスタート arr[0] = 1 arr[1] = 2 // 初期化も宣言できます a := [3]int{1, 2, 3}スライス型
slice
はいわゆる「動的な配列」で、参照型のデータになります。// arrayの宣言と同じだが、長さの宣言は不要 var slice []int // 初期化 slice := []int {1, 2, 3}マップ型
// keyは文字列(string)、valueは整数(int) var numbers map[string]int numbers["one"] = 1 numbers["two"] = 2 // 初期化することもできます numbers := map[string]int{"one":1, "two":2}ポインタ型
a := 5 // int型を格納する領域を準備 var pa *int // ポインタの割り当て pa = &a