teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

実装例追記

2020/07/23 23:58

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -6,4 +6,82 @@
6
6
  実際にやってみたことがあるけれど結局実装を複雑に膨らませただけでいいことは何もありませんでした。
7
7
  使われるかわからない実装をして、そのためのテストを組むのはもったいないですしね。
8
8
 
9
- それでも複数の型に対応する実装を展開する理由ができた場合、僕の場合はgo generateを活用します。
9
+ それでも複数の型に対応する実装を展開する理由ができた場合、僕の場合はgo generateを活用します。
10
+
11
+ ## 追記
12
+
13
+ 現時点での僕のオススメの実装例を以下に示します。
14
+
15
+ 以下のツールをインストールします。
16
+ ```shell
17
+ go get github.com/cheekybits/genny
18
+ ```
19
+
20
+ 以下の2つのコードをメインパッケージにおきます
21
+ (必要ならパッケージを分けても構いません)
22
+ ```go
23
+ package main
24
+
25
+ import "github.com/cheekybits/genny/generic"
26
+
27
+ //go:generate genny -in=$GOFILE -out=gen-$GOFILE gen "Type=string,int"
28
+
29
+ // Type ...
30
+ type Type generic.Number
31
+
32
+ // SortType ...
33
+ func SortType(s []Type) {
34
+ size := len(s)
35
+ for i := 0; i < size; i++ {
36
+ tmp := s[i]
37
+ j := i - 1
38
+
39
+ for j >= 0 {
40
+ if tmp < s[j] {
41
+ s[j+1] = s[j]
42
+ s[j] = tmp
43
+ j--
44
+ } else {
45
+ break
46
+ }
47
+ }
48
+ }
49
+ }
50
+ ```
51
+
52
+ ```go
53
+ package main
54
+
55
+ import "fmt"
56
+
57
+ // Sort ...
58
+ func Sort(s interface{}) {
59
+ switch v := s.(type) {
60
+ case []int:
61
+ SortInt(v)
62
+ case []string:
63
+ SortString(v)
64
+ }
65
+ }
66
+
67
+ func main() {
68
+ is := []int{3, 2, 5}
69
+ Sort(is)
70
+ fmt.Println(is)
71
+ ss := []string{"oge", "moge", "hoge"}
72
+ Sort(ss)
73
+ fmt.Println(ss)
74
+ }
75
+ ```
76
+
77
+ 以下のようにgo-generateを行えば、
78
+ SortInt、SortStringという関数定義が自動生成されます。
79
+
80
+ ```shell
81
+ go generate .
82
+ ```
83
+
84
+ 以下のコマンドで実行したりできます
85
+ ```shell
86
+ go run .
87
+ ```

1

タイポ修正

2020/07/23 23:58

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -4,6 +4,6 @@
4
4
  必要だとわかってるものだけを実装するのがGoの流儀かなと思います。
5
5
 
6
6
  実際にやってみたことがあるけれど結局実装を複雑に膨らませただけでいいことは何もありませんでした。
7
- 使われるかわからない実装をしてのためのテストを組むのはもったいないですしね。
7
+ 使われるかわからない実装をして、そのためのテストを組むのはもったいないですしね。
8
8
 
9
9
  それでも複数の型に対応する実装を展開する理由ができた場合、僕の場合はgo generateを活用します。