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

[]myint不能传递给Join,因为它不是 type fmt.Stringer,所以我必须写:

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

但是,如果我需要parts另一个值必须是整数的操作怎么办?我应该把一片片投到一片myint片上Stringer吗?

4

2 回答 2

6

问:我应该把一片片投到一片myint片上Stringer吗?

Go 中没有强制转换——只有转换。但是从一个具体的、非接口类型的切片转换为一个接口类型的切片是不可能的,除非在循环中显式地进行。原因是,例如在您的情况下,[]myint后备数组的内存布局与[]fmt.Stringer以往不同。(相关常见问题解答

在旁注中,您不必写:

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

这应该同样有效:

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

将 Join 函数更改为

func Join(sep string, parts ...fmt.Stringer) string {
}

使它更容易:

package main

import (
    "fmt"
    "strings"
)

type myint int

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

type myfloat float32

func (f myfloat) String() string {
    return fmt.Sprintf("%0.2f", f)
}

func main() {
    fmt.Println(Join(", ", myint(3), myfloat(3.5543)))
}

func Join(sep string, parts ...fmt.Stringer) string {
    stringParts := make([]string, len(parts))
    for i, part := range parts {
        stringParts[i] = part.String()
    }
    return strings.Join(stringParts, sep)
}
于 2013-07-30T12:56:35.110 回答