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

ゼロ値と型の変換

Go では、明示的な値なしで宣言されたすべての変数は、 ゼロ値: そのタイプの「中立値」。それは大きな違いです JavaScript からの場合は let x; が undefined を生成するか、C の場合は終了します。 ゴミメモリが増えました。 undefined なし、UB なし: ゼロだけです。

ゼロ値テーブル

カテゴリータイプゼロ値
数値int、int64、float32、float64、uint、...0
ブール値boolfalse
文字列string"" (空の文字列)
ポインタ*Tnil
スライス / マップ / チャネル[]T、map[K]V、chan Tnil
機能・インターフェースfunc(...)、interface{...}nil
構造体T struct{...}すべてのフィールドがゼロ値
Go
var i int        // 0
var f float64    // 0
var s string     // ""
var b bool       // false
var p *int       // nil
var nums []int   // nil  (NB: una slice nil ha len 0 e si può iterare!)

変換は常に明示的です

C、Python、JS とは異なり、Go は 自動的に昇格しません 数値型を別の型に変換するには、type(value) と記述する必要があります。

Go
i := 42
var f float64 = float64(i)
var u uint = uint(i)

これは、int や int64 のような「互換性のある」タイプにも当てはまります。 明示的な変換は常に必要です。

Go
var a int = 10
var b int64 = int64(a)  // obbligatorio

数値間の変換: 切り捨てに注意してください

float64 から int に移行すると ゼロに向かって切り捨てられます。 ラウンド:

Go
f := 3.9
i := int(f)   // 3, non 4
n := int(-3.9) // -3, non -4

文字列↔数値変換

string(65) は "65" を与えません。"A" (コード付きのルーン) を与えます。 ポイント65)。文字列→数値、またはその逆の場合は、strconv が必要です。 パッケージ:

Go
import "strconv"

s := strconv.Itoa(42)        // "42"
n, err := strconv.Atoi("42") // 42, nil

Stdlib モジュールで詳しく説明します。

あなたの番です

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

int 型の変数カウンターを初期化せずに宣言し、出力します。期待値: 0。

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

初期化子がない場合、変数は型のゼロ値を受け取ります。

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

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

整数 n=10 の場合、n を float64 に変換し、4 で割ります。結果を出力します (2.5 と予想されます)。

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

明示的な変換を行わない場合、「n / 4」は 2 を与える整数の除算になります。

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

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

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

Go
f := 3.7
fmt.Println(int(f))
回答の選択肢

要約

  • すべてのタイプには一貫したゼロ値があります。undefined や UB はありません。
  • スライス/マップ/チャン/機能/インターフェイス/ポインターの値はゼロです nil。
  • 数値変換は、type(value) を使用して常に明示的に行われます。
  • int(float) はゼロに向かって切り捨てられます。四捨五入するには math.Round を使用します。
  • 文字列 ↔ 数値の場合は、strconv パッケージを使用します (直接キャストではありません)。