鸭子在Go中打字

dea*_*mon 7 duck-typing interface go

我想编写一个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)
}
Run Code Online (Sandbox Code Playgroud)

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

[]myint无法传递给Join,因为它不是类型fmt.Stringer,所以我必须写:

parts := []fmt.Stringer{myint(1), myint(5), myint(6)}
Run Code Online (Sandbox Code Playgroud)

但是如果我需要parts另一个值必须是整数的操作呢?我应该把一片切成myintStringer吗?

zzz*_*zzz 6

问:我应该把一片切成myintStringer吗?

Go - only转换中没有强制转换.但是,从一个具体的非接口类型到一个接口类型的片段的转换是不可能的,除非在循环中明确地进行.原因是,例如在您的情况下,[]myint后备阵列具有不同的内存布局[]fmt.Stringer.(相关常见问题)

在旁注中,您不必写:

parts := []myint{myint(1), myint(5), myint(6)}
Run Code Online (Sandbox Code Playgroud)

这应该相同:

parts := []myint{1, 5, 6}
Run Code Online (Sandbox Code Playgroud)