7

メソッドJoinを使用して任意のオブジェクトを受け取る関数を作成したいと思います。String()

package main

import (
    "fmt"
    "strings"
)

type myint int

func (i myint) String() string {
    return fmt.Sprintf("%d", i)
}

func main() {
    parts := []myint{myint(1), myint(5), myint(6)}
    fmt.Println(Join(parts, ", "))
}

func Join(parts []fmt.Stringer, sep string) string {
    stringParts := make([]string, len(parts))
    for i, part := range(parts) {
        stringParts [i] = part.String()
    }
    return strings.Join(stringParts , sep)
}

http://play.golang.org/p/EhkbyibzHw

[]myintJoinタイプではないため、に渡すことはできません。そのため、次のfmt.Stringerように記述する必要があります。

parts := []fmt.Stringer{myint(1), myint(5), myint(6)}

しかしparts、値がintでなければならない別の操作が必要な場合はどうなりますか?myintのスライスをその時のスライスにキャストする必要がありStringerますか?

4

2 に答える 2

6

myintQ: スライス オブ テンをスライスオブ テンにキャストする必要がありStringerますか?

Go にはキャストはなく、変換のみです。ただし、具体的な非インターフェイス型のスライスからインターフェイス型のスライスへの変換は、ループで明示的に行う場合を除き、不可能です。その理由は、たとえばあなたの場合のように、[]myintバッキング アレイのメモリ レイアウトが異なるため[]fmt.Stringerです。(関連 FAQ )

余談ですが、次のように書く必要はありません。

parts := []myint{myint(1), myint(5), myint(6)}

これは同じように動作するはずです:

parts := []myint{1, 5, 6}
于 2012-11-06T12:12:45.280 に答える