用类型参数替换接口参数有什么好处?

max*_*_ge 2 generics interface go type-parameter

定义一个接口类型来输入参数,如下所示:

func CallByteWriterGen[W io.ByteWriter](w W, bytes []byte) {
  _ = w.WriteByte(bytes[0])
}
Run Code Online (Sandbox Code Playgroud)

...通过字典导致额外的指针取消引用(使用 AX 传递):

MOVQ 0x10(AX), DX // <-- extra pointer dereference 
MOVQ 0x18(DX), DX
MOVZX 0(CX), CX
MOVQ BX, AX
MOVL CX, BX
CALL DX
Run Code Online (Sandbox Code Playgroud)

仅使用接口参数可能无法实现哪些好处,如下所示:

func CallByteWriter(w io.ByteWriter, bytes []byte) {
  _ = w.WriteByte(bytes[0])
}
Run Code Online (Sandbox Code Playgroud)

Eli*_*sky 6

接口版本是惯用的,而不是类型参数版本 - 在需要接口的地方使用接口。

\n

有关其他信息和详细信息,请参阅何时使用泛型 博客文章,特别是 Don\xe2\x80\x99t 用类型参数替换接口类型部分

\n
\n

例如,可能很想将此处仅使用接口类型的第一个函数签名更改为使用类型参数的第二个版本。

\n

func ReadSome(r io.Reader) ([]字节,错误)

\n

func ReadSome[T io.Reader](r T) ([]字节,错误)

\n

不要\xe2\x80\x99 进行这样的更改。省略类型参数使函数更易于编写、阅读,并且执行时间可能相同。

\n
\n