モジュール 1 · レッスン 2 / 5コース内の 2/50~10 min
モジュールのレッスン (2/5)
ゼロ値と型の変換
Go では、明示的な値なしで宣言されたすべての変数は、
ゼロ値: そのタイプの「中立値」。それは大きな違いです
JavaScript からの場合は let x; が undefined を生成するか、C の場合は終了します。
ゴミメモリが増えました。 undefined なし、UB なし: ゼロだけです。
ゼロ値テーブル
| カテゴリー | タイプ | ゼロ値 |
|---|---|---|
| 数値 | int、int64、float32、float64、uint、... | 0 |
| ブール値 | bool | false |
| 文字列 | string | "" (空の文字列) |
| ポインタ | *T | nil |
| スライス / マップ / チャネル | []T、map[K]V、chan T | nil |
| 機能・インターフェース | 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, nilStdlib モジュールで詳しく説明します。
あなたの番です
運動#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パッケージを使用します (直接キャストではありません)。