問1 ゼロ値を予言せよ
初段 / 目安 15分
TypeScript道場を突破したあなたに、凛さんからメッセージが届きました。
「fleama、アクセス増で Node版 API が悲鳴を上げています。Goリプレイス計画、始動します。リードは私。実装は——あなたにお願いします。ルールは前と同じ。私の CI が通らないコードはマージしません」
最初の課題は、書く前に考える課題です。
「宣言だけして初期化していない変数たち。それぞれ何が入っているか、実行する前に予言を書いてから、コードで確かめてください。Go では『分からない』は存在しません」
Go では、var で宣言しただけの変数にも必ず値が入ります。これをゼロ値と呼びます。JavaScript の undefined のような「まだ何も無い状態」は存在しません。型が決まれば、初期値も決まります。
数値は 0、文字列は空、真偽値は false です。ここまでは素直です。少し違うのがスライスで、こちらのゼロ値は nil になります。ただし nil のスライスでも len は取れて 0 を返しますし、append もそのまま使えます。空だが壊れてはいないという状態です。
完成条件
初期化していない変数の中身を組み立てて返す関数 predictZero を完成させてください。
ひな形では var で int string bool []string の4つを宣言しています。その値から次の形の1行を作ります。引数の addOne が true のときだけ、スライスに1件だけ append してから調べます(nil でなくなることを確かめるためです)。
プレーンテキスト
int=0 string=空 bool=false slice=nil(len 0)文字列のゼロ値は見えないので、空だったときは 空 という字に置き換えて出してください。スライスは nil と等しいかどうかで nil か あり を出し分け、そのあとに (len 0) の形で長さを添えます。
数値と真偽値と長さの文字変換、結果の連結はひな形に用意しました。あなたが書くのは、空文字と nil の2つの判定だけです。int・string・bool は宣言直後のまま読み、addOne に応じた変更はスライスだけに行います。
:= は新しい変数を作って値を入れ、= は既存の変数を変えます。if は条件が合うときだけ波かっこ内を実行します。別の例で、空の案内文に表示名を付けてみましょう。
Go
var notice string
label := notice
if label == "" {
label = "準備中"
}この例でも元の notice は空文字のままです。スライスの判定には == nil、長さの確認には len を使えます。
要件
- 用意された4つの
var宣言を使い、n・s・bに値を代入しない。addOneによるスライスだけの追加処理はそのまま使う shownが空文字なら、表示用の空を代入するitemsがnilならsliceStateをnilにする。そうでなければ既存のありを使い、長さは用意された返却処理に任せる
ヒント
前のヒントを開くと次が開きます。開かずに解けると未開封クリアです