Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Interface 鸭子在围棋中打字_Interface_Go_Duck Typing - Fatal编程技术网

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)
}