質問したいこと
interface を引数に持つ関数の内部で、switch 文を使って引数の型ごとに処理を分けるときにどのようにしたら簡潔にコードをかけるかわからない
環境
- Ubuntu 18.04
- go 1.14.2
問題の詳細
挿入ソートのコードを go を使って書いています。
go
1package insertsort 2 3func insertSort(x interface{}, size int) { 4 switch value := x.(type) { 5 case *[]int: 6 for i := 0; i < size; i++ { 7 tmp := (*value)[i] 8 j := i - 1 9 10 for j >= 0 { 11 if tmp < (*value)[j] { 12 (*value)[j+1] = (*value)[j] 13 (*value)[j] = tmp 14 j-- 15 } else { 16 break 17 } 18 } 19 } 20 case *[]string: 21 for i := 0; i < size; i++ { 22 tmp := (*value)[i] 23 j := i - 1 24 25 for j >= 0 { 26 if tmp < (*value)[j] { 27 (*value)[j+1] = (*value)[j] 28 (*value)[j] = tmp 29 j-- 30 } else { 31 break 32 } 33 } 34 } 35 default: 36 37 } 38} 39
引数には整数の配列や文字列の配列などを許容したくて interface{}
にしています。中の処理では、型ごとに switch
を使って分岐しているのですが、 *[]int
のブランチと *[]string
のブランチで中身は全く同じになってしまっています。
これを解決するために分岐の部分を
go
1case *[]int, *[]string:
のように書いてみたのですが、invalid indirect of value (type interface {})
というエラーが出てしまいます。
この書き方だと上のブランチのほかに *[]float64
などどんどん分岐を増やしていくと重複だらけのコードになってしまうので困っているのですが、どのように書くのが正しいのでしょうか?
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/23 11:20
2020/07/23 14:36
2020/07/24 00:10
2020/07/24 05:36