Interface 鸭子在围棋中打字
我想编写一个Interface 鸭子在围棋中打字,interface,go,duck-typing,Interface,Go,Duck Typing,我想编写一个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
函数,该函数使用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)
}
[]myint
无法传递给Join
,因为它不是fmt.Stringer
类型,所以我必须写:
parts := []fmt.Stringer{myint(1), myint(5), myint(6)}
但是如果我需要零件
来执行另一个值必须为int的操作,该怎么办?那么,我是否应该将一片myint
转换成一片Stringer
问:那么,我应该把一片myint
转换成一片Stringer
只有Go-only转换中没有强制转换。但从具体的、非接口类型的切片转换为接口类型的切片是不可能的,除非在循环中显式地进行转换。原因是,例如在您的示例中,[]myint
后备数组的内存布局与[]fmt.Stringer
的内存布局不同。()
在旁注上,你不必写:
parts := []myint{myint(1), myint(5), myint(6)}
这应该同样有效:
parts := []myint{1, 5, 6}
将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)
}