GO/TESTS JAVA → TS →

Go 1.22 / testing

Goの挙動を、
テストで観測する。

説明より先に、実行できる境界条件を見る。Go by Tests は、Sourceとtestingを並べて読むためのExecutable Documentationです。

utf8.goutf8_test.go→
Source → Test / observed

The method

仕様を暗記する前に、
テストの観測結果を読む。

01

Source

確認したい最小のGoコードだけを置きます。

02

Test

testingパッケージで、挙動をそのまま固定します。

03

Evidence

値、nil、error、signalを短い結果として残します。

Initial catalog

まずは、37個の確かな挙動から。

37 / 37
01
Language

string: len は文字数ではなくUTF-8のバイト数を返す

Test 絵文字を含む文字列ではバイト数とrune数が異なる

GoのstringはUTF-8バイト列であり、絵文字を含むとlenとrune数は一致しません。

Go 1.22+→
02
Language

string: range のindexはrune番号ではなくバイト位置になる

Test 文字列に対するrangeのindexはrune番号ではなくバイト位置になる

文字列をrangeするとruneを取り出せますが、indexはUTF-8のバイトオフセットです。

Go 1.22+→
03
Collections

slice: 容量に余裕があるappendは同じ配列を書き換える

Test 容量に余裕があるsliceへのappendは同じバッキング配列を書き換える

appendが必ず新しい配列を確保するとは限らず、元のsliceと配列を共有することがあります。

Go 1.22+→
04
Collections

slice: nilと空sliceはJSONで異なる

Test nilSliceと空sliceはJSONで異なる値になる

どちらもlenは0ですが、nil sliceはJSONでnull、空sliceは[]になります。

Go 1.22+→
05
Collections

map: 存在しないキーも値だけを読むとゼロ値になる

Test 存在しないmapキーも値だけを読むとゼロ値になる

mapの読み取りは未登録でも要素型のゼロ値を返すため、値だけでは存在を判定できません。

Go 1.22+→
06
Language

interface: nilポインタを入れたinterfaceはnilではない

Test Nilポインタを入れたinterfaceはnilではない

型情報とnil値を持つinterfaceは、値だけがnilのinterfaceとは異なります。

Go 1.22+→
07
Error Handling

error: ラップした原因はerrors.Isで照合する

Test ラップしたerrorはerrorsIsで原因と照合できる

fmt.Errorfの%wで文脈を付けたerrorは、直接比較ではなくerrors.Isで原因を確認します。

Go 1.22+→
08
Error Handling

defer: 引数は登録時に評価され、呼び出しはLIFOになる

Test Deferの引数はdefer文を実行した時点で評価される

deferは関数終了時に実行されますが、引数はdefer文を通過した時点で評価されます。

Go 1.22+→
09
Concurrency

context: cancelされたcontextはcontext.Canceledを返す

Test CancelしたcontextはcontextCanceledを返す

contextのキャンセルはDoneチャネルを閉じ、Errからcontext.Canceledとして観測できます。

Go 1.22+→
10
Concurrency

channel: 閉じたchannelの受信はゼロ値とfalseを返す

Test 閉じたchannelの受信はゼロ値とfalseを返す

channelを閉じた後でも受信は直ちに返り、値のゼロ値とok=falseで終了を示します。

Go 1.22+→
11
Date / Time

time.Time: 同じ瞬間でも==とEqualは異なる

Test 同じ時刻でもlocationが異なるtimeTimeはEqualと比較結果が異なる

==はlocationなどの内部表現も比較しますが、Equalは同じ時点を表すか比較します。

Go 1.22+→
12
Encoding

encoding/json: omitemptyは数値のゼロ値を省略する

Test OmitEmptyは数値のゼロ値をJSONから省略する

omitemptyを付けたintは0のときJSONから消えるため、0と未指定を区別できません。

Go 1.22+→
13
Concurrency

Go 1.22: range変数はgoroutineで各反復ごとに捕捉される

Test Go122ではrange変数をgoroutineが各反復ごとに捕捉する

Go 1.22以降はrangeのループ変数が反復ごとに新しくなるため、goroutine内の値が分離されます。

Go 1.22+→
14
Language

strings.Builder: 書き込み後にコピーするとpanicになる

Test 書き込み後のstringsBuilderをコピーするとpanicになる

書き込み済みのstrings.Builderを値コピーして再利用すると、実行時にpanicします。

Go 1.22+→
15
Language

string: []byteへの変換結果を変更しても元の文字列は変わらない

Test StringをByteSliceへ変換して変更しても元の文字列は変わらない

stringを[]byteへ変換すると、変更可能な別のバイト列として扱えます。

Go 1.22+→
16
Collections

map: nil mapは読み取りできても書き込みでpanicになる

Test NilMapは読み取りできても書き込みでpanicになる

nil mapへの読み取りはゼロ値を返しますが、代入するとpanicします。

Go 1.22+→
17
Collections

slices.Clone: 別のバッキング配列を作る

Test SlicesCloneは別のバッキング配列を作る

slices.Cloneで複製したsliceを変更しても、元のsliceは書き換わりません。

Go 1.22+→
18
Language

interface: sliceを格納した値同士の比較はpanicになる

Test Sliceを持つinterface値同士の比較はpanicになる

interface自体は比較可能でも、動的な値がsliceなら==の評価時にpanicします。

Go 1.22+→
19
Error Handling

errors.Join: 複数の原因をerrors.Isで照合できる

Test ErrorsJoinした複数の原因をErrorsIsで照合できる

errors.Joinでまとめたエラーは、含まれる各原因をerrors.Isで見つけられます。

Go 1.22+→
20
Error Handling

errors.As: ラップしたポインタ型の原因を取り出す

Test ErrorsAsでポインタ型の原因を取り出せる

errors.Asはラップ階層から目的の具体的なエラー型を取り出せます。

Go 1.22+→
21
Error Handling

defer: Closeのエラーは明示的に返さなければ失われる

Test DeferしたCloseのエラーは明示的に返さなければ失われる

deferでCloseを呼ぶだけでは、その失敗を関数の返り値へ反映できません。

Go 1.22+→
22
Concurrency

context: 期限切れはcontext.DeadlineExceededとして観測する

Test Timeout期限切れはContextDeadlineExceededを返す

WithTimeoutやWithDeadlineで期限が切れると、Errはcontext.DeadlineExceededになります。

Go 1.22+→
23
Concurrency

channel: nil channelを含むselect caseは無効になる

Test NilChannelを含むSelectCaseは無効になる

nil channelの送受信caseはselectから外れ、defaultがあればdefaultが選ばれます。

Go 1.22+→
24
Concurrency

sync.Once: panicしてもDoは再実行しない

Test SyncOnceはPanicしても再実行しない

Once.Doの関数がpanicしても、そのOnceは完了済みとして扱われます。

Go 1.22+→
25
Encoding

encoding/json: 非公開フィールドはタグがあっても出力しない

Test EncodingJsonは非公開フィールドを出力しない

encoding/jsonは小文字で始まる非公開フィールドをJSONの対象にしません。

Go 1.22+→
26
Concurrency

sync.Map: Loadの結果は型アサーションなしに使えない

Test SyncMapのLoad結果は型アサーションなしに使えない

sync.Mapは値をanyとして返すため、読み出し側で期待する型を確認する必要があります。

Go 1.22+→
27
HTTP

http.Response.Body: 読み終えた後にCloseする

Test HTTPResponseBodyは読み終えた後にCloseする

HTTPレスポンスのBodyは読み終えた後に必ずcloseし、接続を適切に解放します。

Go 1.22+→
28
Date / Time

time.Duration: 無単位の整数はナノ秒として扱われる

Test 無単位のDurationはナノ秒として扱われる

time.Durationへ直接渡した整数は、ミリ秒でなくナノ秒を表します。

Go 1.22+→
29
Concurrency

context.WithValue: 文字列キーを共有すると値が衝突する

Test ContextWithValueで文字列キーを共有すると値が衝突する

同じ文字列キーを使うWithValueは、より内側で設定した値が前の値を隠します。

Go 1.22+→
30
Language

range: 反復中にappendしても開始時の長さまでしか走査しない

Test Range中にAppendしても反復回数は開始時の長さで固定される

rangeが対象にする反復回数は開始時に決まり、ループ中にappendした要素を追加で走査しません。

Go 1.22+→
31
Error Handling

recover: deferした関数から直接呼ばなければpanicを回復できない

Test RecoverはDeferした関数から直接呼ばなければPanicを回復できない

recoverをヘルパー関数へ委譲すると、panicは回復されずに呼び出し元へ伝播します。

Go 1.22+→
32
Concurrency

channel: 閉じたchannelへ送信するとpanicになる

Test 閉じたChannelへの送信はPanicになる

close済みのchannelに送信すると、受信のゼロ値とは異なり実行時panicになります。

Go 1.22+→
33
Encoding

encoding/json: 未知フィールドは既定で無視される

Test EncodingJsonは未知フィールドを既定で無視しDisallowUnknownFieldsで拒否できる

json.Unmarshalはstructに存在しないキーを既定で無視し、DecoderのDisallowUnknownFieldsで拒否できます。

Go 1.22+→
34
Concurrency

context: WithCancelCauseではErrとCauseが異なる

Test WithCancelCauseではErrはCanceledでCauseは指定した原因になる

キャンセル状態はcontext.Canceledのままで、業務上の失敗原因はcontext.Causeから取り出します。

Go 1.22+→
35
Collections

array と slice: 配列はコピーされsliceは要素を共有する

Test 配列は値としてコピーされsliceは要素を共有する

配列の引数は値として渡り、sliceの要素変更は呼び出し元へ反映されます。

Go 1.22+→
36
Language

receiver: value receiverはコピー、pointer receiverは元を更新する

Test valueReceiverはコピーを更新しpointerReceiverは呼び出し元を更新する

value receiverの変更は呼び出し元へ残らず、pointer receiverの変更は元の値へ反映されます。

Go 1.22+→
37
Concurrency

channel: buffered channelは容量まで受信者なしで送信できる

Test bufferedChannelは受信者なしでも容量まで送信できる

buffered channelは空き容量がある間、受信側を待たずに送信を受け付けます。

Go 1.22+→

Static index

教材を検索

テーマ、タグ、テスト名、カテゴリ、Goバージョンで絞り込みます。

37件の教材を表示しています。

Language · Go 1.22+string: len は文字数ではなくUTF-8のバイト数を返すTest 絵文字を含む文字列ではバイト数とrune数が異なるLanguage · Go 1.22+string: range のindexはrune番号ではなくバイト位置になるTest 文字列に対するrangeのindexはrune番号ではなくバイト位置になるCollections · Go 1.22+slice: 容量に余裕があるappendは同じ配列を書き換えるTest 容量に余裕があるsliceへのappendは同じバッキング配列を書き換えるCollections · Go 1.22+slice: nilと空sliceはJSONで異なるTest nilSliceと空sliceはJSONで異なる値になるCollections · Go 1.22+map: 存在しないキーも値だけを読むとゼロ値になるTest 存在しないmapキーも値だけを読むとゼロ値になるLanguage · Go 1.22+interface: nilポインタを入れたinterfaceはnilではないTest Nilポインタを入れたinterfaceはnilではないError Handling · Go 1.22+error: ラップした原因はerrors.Isで照合するTest ラップしたerrorはerrorsIsで原因と照合できるError Handling · Go 1.22+defer: 引数は登録時に評価され、呼び出しはLIFOになるTest Deferの引数はdefer文を実行した時点で評価されるConcurrency · Go 1.22+context: cancelされたcontextはcontext.Canceledを返すTest CancelしたcontextはcontextCanceledを返すConcurrency · Go 1.22+channel: 閉じたchannelの受信はゼロ値とfalseを返すTest 閉じたchannelの受信はゼロ値とfalseを返すDate / Time · Go 1.22+time.Time: 同じ瞬間でも==とEqualは異なるTest 同じ時刻でもlocationが異なるtimeTimeはEqualと比較結果が異なるEncoding · Go 1.22+encoding/json: omitemptyは数値のゼロ値を省略するTest OmitEmptyは数値のゼロ値をJSONから省略するConcurrency · Go 1.22+Go 1.22: range変数はgoroutineで各反復ごとに捕捉されるTest Go122ではrange変数をgoroutineが各反復ごとに捕捉するLanguage · Go 1.22+strings.Builder: 書き込み後にコピーするとpanicになるTest 書き込み後のstringsBuilderをコピーするとpanicになるLanguage · Go 1.22+string: []byteへの変換結果を変更しても元の文字列は変わらないTest StringをByteSliceへ変換して変更しても元の文字列は変わらないCollections · Go 1.22+map: nil mapは読み取りできても書き込みでpanicになるTest NilMapは読み取りできても書き込みでpanicになるCollections · Go 1.22+slices.Clone: 別のバッキング配列を作るTest SlicesCloneは別のバッキング配列を作るLanguage · Go 1.22+interface: sliceを格納した値同士の比較はpanicになるTest Sliceを持つinterface値同士の比較はpanicになるError Handling · Go 1.22+errors.Join: 複数の原因をerrors.Isで照合できるTest ErrorsJoinした複数の原因をErrorsIsで照合できるError Handling · Go 1.22+errors.As: ラップしたポインタ型の原因を取り出すTest ErrorsAsでポインタ型の原因を取り出せるError Handling · Go 1.22+defer: Closeのエラーは明示的に返さなければ失われるTest DeferしたCloseのエラーは明示的に返さなければ失われるConcurrency · Go 1.22+context: 期限切れはcontext.DeadlineExceededとして観測するTest Timeout期限切れはContextDeadlineExceededを返すConcurrency · Go 1.22+channel: nil channelを含むselect caseは無効になるTest NilChannelを含むSelectCaseは無効になるConcurrency · Go 1.22+sync.Once: panicしてもDoは再実行しないTest SyncOnceはPanicしても再実行しないEncoding · Go 1.22+encoding/json: 非公開フィールドはタグがあっても出力しないTest EncodingJsonは非公開フィールドを出力しないConcurrency · Go 1.22+sync.Map: Loadの結果は型アサーションなしに使えないTest SyncMapのLoad結果は型アサーションなしに使えないHTTP · Go 1.22+http.Response.Body: 読み終えた後にCloseするTest HTTPResponseBodyは読み終えた後にCloseするDate / Time · Go 1.22+time.Duration: 無単位の整数はナノ秒として扱われるTest 無単位のDurationはナノ秒として扱われるConcurrency · Go 1.22+context.WithValue: 文字列キーを共有すると値が衝突するTest ContextWithValueで文字列キーを共有すると値が衝突するLanguage · Go 1.22+range: 反復中にappendしても開始時の長さまでしか走査しないTest Range中にAppendしても反復回数は開始時の長さで固定されるError Handling · Go 1.22+recover: deferした関数から直接呼ばなければpanicを回復できないTest RecoverはDeferした関数から直接呼ばなければPanicを回復できないConcurrency · Go 1.22+channel: 閉じたchannelへ送信するとpanicになるTest 閉じたChannelへの送信はPanicになるEncoding · Go 1.22+encoding/json: 未知フィールドは既定で無視されるTest EncodingJsonは未知フィールドを既定で無視しDisallowUnknownFieldsで拒否できるConcurrency · Go 1.22+context: WithCancelCauseではErrとCauseが異なるTest WithCancelCauseではErrはCanceledでCauseは指定した原因になるCollections · Go 1.22+array と slice: 配列はコピーされsliceは要素を共有するTest 配列は値としてコピーされsliceは要素を共有するLanguage · Go 1.22+receiver: value receiverはコピー、pointer receiverは元を更新するTest valueReceiverはコピーを更新しpointerReceiverは呼び出し元を更新するConcurrency · Go 1.22+channel: buffered channelは容量まで受信者なしで送信できるTest bufferedChannelは受信者なしでも容量まで送信できる