2022/02/06

[golang] 制御文(C言語の人から)

最近 golangを使うことが多い。
比較的 C言語に近いのだが、同じではないので調べ調べというところだ。

「プログラミング言語Go」を買ったのだけど、制御文についてはまとまった章で説明されていないので困っている。
自分でまとめておこう。


更新日:2022/02/06

 

if : ある

 

プログラミング言語Go: p.24, 238, 10, 24, 53
if statements

 

基本

if 条件 {
  xxx
}

if 文; 条件 {
  xxx
}

else類

} else if あああ {
  xxx
}

} else {
  xxx
}

 

備考

条件を () でくるむ必要はない。
文が書けるのは C言語っぽいが、宣言した変数の影響範囲=スコープはそれ以降のif内までなので C言語より狭い。
まあ、C言語だとその場で宣言できないから比べられないが。

C言語風に、先に変数を宣言してから if文で使ってもよいのだろうが、そうするとスコープが外れにくくてガベッジコレクションしにくくなるとかかもしれない。


for : ある

 

プログラミング言語Go: p.6, 52
for statements

基本

for 条件 {
  xxx
}

for 初期化; 状態; 後処理 {
  xxx
}

for レンジ表現 {
  xxx
}

備考

p.6 に「複数の形式がありますが次はその一つです」とあるが、じゃあ p.52 に他の形式の説明があるのかと思うとそうではない。そもそも p.52 は forの説明じゃなくてスコープの説明だし。
たぶん私がこの記事を書こうと思ったのも、forについてまとまった説明がなかったからだと思う。

しょうがないので言語仕様を見る。

  • with single condition
  • with for clause
  • with range clause

"with for clause" が C言語風の表現だ。

"with single condition" は while に近い。つまり繰り返し条件だけを書く。

"with range clause" は多彩なようだ。多才というのがよいのか。
文は1つだけしか書けないようだから "with single condition" に近いのかもしれない。
ただ "range" という識別子を使うからそう呼ばれるのだろう。


while : ない

for で代用


do-while : ない

代用するものが無いので、for でまかなうようにするしかないだろう。


switch-case : ある

 

プログラミング言語Go: p.26, 53, 243, 244, 246, 379, 27
switch statements

基本

switch 評価値 {
case 一致1:
  xxx
case 一致2:
  yyy
default:
  zzz
}

switch {
case 一致1:
  xxx
case 一致2:
  yyy
default:
  zzz
}

備考

書きたいことを書いておこう。

  • case ごとの break が必須ではない(break しなくても fallthrough しない)
    • fallthrough があるらしい。識別子のようだけど説明があまりない。
  • 文字列も使える

まあ、C言語でも fallthrough によるバグはお手本のように出てくるから、言語でなくすのも理解できる。

評価内容を書かずに switch を使えるなら if はいらないんじゃないのという気もする。まあ、そんなことをいえば C言語だって switchなくして if だけでいいやんってことになるのだけど。

 

Type switches

プログラミング言語Go: p.243
Type switches

基本

switch target.(type) {
case nil:
  xxx
case int, uint:
  xxx
case *MyType:
  xxx
}

説明

switch文の一種と見なしてよいのかどうかわからない。if文でも書けるのだが、switch文でやった方がわかりやすい。
型がなんなのかわからない変数の判定に使うときの書き方だ。
C言語の ... を解釈するときのやり方みたいなイメージだが、ちゃんと自前の型でもチェックできる。
例はリンク先を見てもらった方が良かろう。

 


三項演算子 : ない

"Go言語はシンプルだ"という評判を聞いたとき、心配したのは三項演算子だ。
そう、わかる。
三項演算子というのはわかりづらい演算子だということはよくわかるのだ。
そもそも if などで十分対応できるものだし、なぜ三項演算子が生き残る理由があるというのだろうか?
いや、ない。
だから Go言語にも三項演算子はない。

しかし・・・納得はしつつも存在して置いてほしかったという個人の感想は消え去ることができない。
三項演算子を許容すると、さらにその中に三項演算子を入れ込んで、という状況を生んでしまうからきりがない。
そういうのを頭で理解しても、やっぱり三項演算子はほしかったなー、と思ってしまうのは C言語歴が長いからだと思っておこう。

ともかく、ないのだ。


Go言語にしかないものもあるけど、今回は C言語にあるものという観点だから記載しない。