メインコンテンツにスキップ
モジュール 1 · レッスン 4 / 5コース内の 4/50~8 min
モジュールのレッスン (4/5)

オペレーター

Go には、予想通りの 古典的な演算子 が備わっていますが、驚くべき点はほとんどありません。 算術、比較、論理、ビット単位。三項演算子はありません (a ? b : c)、オーバーロードなし、型間の暗黙的な変換なし。 シンプルさが特徴です。

算術

Go
a, b := 10, 3
fmt.Println(a + b)  // 13
fmt.Println(a - b)  // 7
fmt.Println(a * b)  // 30
fmt.Println(a / b)  // 3   ← divisione INTERA tra interi
fmt.Println(a % b)  // 1   ← resto (modulo)

インクリメントとデクリメントは式ではなくステートメントです

x++ と x-- は値を生成しません。これらは「アクション」であり何も生成しません。 もっと。 C のような y := x++ はありません。

Go
x := 5
x++          // ok: incrementa x
// y := x++  // ERRORE di compilazione
fmt.Println(x) // 6

比較

== != < <= > >= は bool を返します。これらは数値と文字列に適用されます。のために 構造体のすべてのフィールドは比較可能である必要があります (内部にスライス/マップはありません)。

Go
"abc" == "abc"  // true
"abc" < "abd"   // true (ordine lessicografico)
3 != 4           // true

論理的短絡あり

&&、||、!。左から右に短絡します: 最初の場合 オペランドは結果を決定するのに十分ですが、2 番目は偶数ではありません 評価されました。

Go
adult := age >= 18
seniorAdult := age >= 18 && age < 65

ビットごと

& AND、| OR、^ XOR、<< 左シフト、>> 右シフト、&^ AND 違います (少し明らかです)。これらはフラグ、バイナリ解析、 最適化:

Go
flags := uint8(0b0000_0011)
flags |= 0b0000_0100   // imposta un bit:    0000_0111
flags &^= 0b0000_0010  // cancella un bit:   0000_0101
hasFlag := flags & 0b0000_0100 != 0  // true

暗黙的な変換はありません

Go の 1 + 1.5 は コンパイルします。どちらも型なしリテラルであるためです。 ただし、var i int = 1; i + 1.5 は 違います。float64(i) + 1.5 が必要です。

Go
i := 1
f := 1.5
// i + f          // ERRORE
float64(i) + f    // 2.5

あなたの番です

運動#go.m1.l4.e1
試行回数: 0読み込み中…

17 を 5 で割った余りを計算し、出力します。期待値: 2.

エディターを読み込み中…
ヒントを表示

モジュロ演算子は「%」です。

3 回の試行後に解決策が利用可能になります

運動#go.m1.l4.e2
試行回数: 0読み込み中…

年齢が 18 から 65 までの場合は true、それ以外の場合は false を出力します。

エディターを読み込み中…
ヒントを表示

2 つの比較を `&&` で結合します。

3 回の試行後に解決策が利用可能になります

Quiz#go.m1.l4.e3
準備完了

このコードは何を出力しますか?

Go
a, b := 7, 2
fmt.Println(a/b, a%b)
回答の選択肢

要約

  • 古典的な算術。 int 間の / は整数の除算 (切り捨て) です。
  • ++ および -- は式ではなくステートメントです。いいえ、y := x++ は使用できません。
  • 比較演算子と論理演算子は bool を生成します。 &&/|| ショート。
  • フラグとバイナリ解析用のビット単位 & | ^ << >> &^。
  • 異なる型間の暗黙的な変換はありません。type(x) を使用してください。