2016-03-18 8 views
0

sort.IntSliceReverseSortメソッドを作成したいと思います。だから私はMySliceのカスタムタイプを作成し、ReverseSortのメソッドを追加しました。 ゴランの派生カスタムタイプの基本タイプのメソッドを再利用

package main 

import (
    "fmt" 
    "sort" 
) 

type MySlice sort.IntSlice 

func (ms MySlice) ReverseSort() { 
    sort.Sort(sort.Reverse(ms)) 
} 
func main() { 
    t2 := MySlice{5, 4, 3, 1} 
    t2.ReverseSort() 
    fmt.Println(t2) 
} 

しかし、このプログラムのエラーを実行している上

cannot use ms (type MySlice) as type sort.Interface in argument to sort.Reverse: 
     MySlice does not implement sort.Interface (missing Len method) 

は、私は私のカスタムタイプのために私自身のLenSwapLessメソッドを作成せずにこれを実装することが可能な方法があることが示されています。

答えて

2

あなたのカスタムタイプにsort.IntSliceを埋め込むことができます:(。the Go Playgroudオン)

type MySlice struct { 
    sort.IntSlice 
} 

func (ms MySlice) ReverseSort() { 
    sort.Sort(sort.Reverse(ms)) 
} 

func main() { 
    t2 := MySlice{sort.IntSlice{5, 4, 3, 1}} 
    t2.ReverseSort() 
    fmt.Println(t2) 
} 

もちろん、それはより困難なオブジェクトを構築します。


A post on golang-nutsこれについて説明します。

あなたがデザインによって "[S]非局所的なタイプに新しいメソッドを定義することはできません"。

非ローカルタイプをローカルタイプ ローカルタイプに埋め込み、拡張することをお勧めします。タイプエイリアシング(タイプMyFoo Foo)は、オリジナルとはまったく別の(多くの場合もあれば少なく) タイプを作成します。私は で、それを回避するためにタイプ アサーションを使用する簡単な/ベストプラクティスの方法を認識していません。

  • ピーターBourgon

そして:

タイプの方法は、それを定義するパッケージです。

これは論理的な一貫性です。それは編集の美徳です。 は、大規模なメンテナンスや複数人の開発プロジェクトにとって重要な利点であると見なされています。

上記のように 基本タイプを新しいタイプに埋め込み、 に必要なものを追加することができるので、話す力は失われません。新しいタイプが新しい名前でなければならず、そのフィールドのすべてが であり、メソッドがその新しいパッケージに含まれていなければならないことに注意してください。

  • マイケル・ジョーンズ
関連する問題