すきま風

勉強したことのメモとか

Goでsliceを2次元sliceに変換する

2年に1回くらい必要になってその都度考えてしまうロジック。年々書ききるのに時間がかかるようになってきた 😔

func main() {
    slice := make([]int, 150)
    for i := 0; i < 150; i++ {
        slice[i] = i
    }

    results := split(&slice, 100)
    fmt.Printf("results size %d, result0 size %d, result1 size %d", len(results), len(results[0]), len(results[1]))
    // -> results size 2, result0 size 100, result1 size 50
}

// sliceをmaxSizeのsliceに分割する
func split(s *[]int, max int) [][]int {
    slice := *s

    // resultsのsizeを決定する
    sliceLen := len(slice)
    resultsSize := int(math.Ceil(float64(sliceLen) / float64(max)))

    results := make([][]int, resultsSize)
    for i := 0; i < resultsSize; i++ {
        from := i * max
        step := int(math.Min(float64(max), float64(sliceLen)))
        results[i] = slice[from : from+step]

        sliceLen -= step
    }

    return results
}

GoはGenericsがないのが辛い。もっと簡単な方法ないかな 🤔