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另一个值必须是整数的操作呢?我应该把一片切成myint片Stringer吗?
问:我应该把一片切成
myint片Stringer吗?
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)