func draw(drawables []Drawable) Drawable { // 2.提供割合の合計値を計算する var total int for _, d := range drawables { total += d.GetRatio() } // 3.合計値の範囲で乱数を生成する random := rand.Intn(total) // 4.乱数をもとに抽選結果を決定する var temp int for _, d := range drawables { temp += d.GetRatio() if temp > random { return d } } return nil } draw関数に抽選ロジック2〜4実装 2.提供割合の合計値を計算する 3.合計値の範囲で乱数を生成する 4.乱数をもとに抽選結果を決定する
func draw(drawables []Drawable) Drawable { // 2.提供割合の合計値を計算する var total int for _, d := range drawables { total += d.GetRatio() } // 3.合計値の範囲で乱数を生成する random := rand.Intn(total) // 4.乱数をもとに抽選結果を決定する var temp int for _, d := range drawables { temp += d.GetRatio() if temp > random { return d } } return nil } []Drawableを受け取る
func draw(drawables []Drawable) Drawable { // 2.提供割合の合計値を計算する var total int for _, d := range drawables { total += d.GetRatio() } // 3.合計値の範囲で乱数を生成する random := rand.Intn(total) // 4.乱数をもとに抽選結果を決定する var temp int for _, d := range drawables { temp += d.GetRatio() if temp > random { return d } } return nil } 提供割合を取得し抽選
func draw(drawables []Drawable) Drawable { // 2.提供割合の合計値を計算する var total int for _, d := range drawables { total += d.GetRatio() } // 3.合計値の範囲で乱数を生成する random := rand.Intn(total) // 4.乱数をもとに抽選結果を決定する var temp int for _, d := range drawables { temp += d.GetRatio() if temp > random { return d } } return nil } 抽選結果をDrawableで返却
func draw[T Drawable](drawables []T) T { // 2.提供割合の合計値を計算する var total int for _, d := range drawables { total += d.GetRatio() } // 3.合計値の範囲で乱数を生成する random := rand.Intn(total) // 4.乱数をもとに抽選結果を決定する var temp int for _, d := range drawables { temp += d.GetRatio() if temp > random { return d } } // return nilだとコンパイルエラーになる var ret T return ret } Drawable型の型パラメータTを定義 引数、戻り値もTに変更