go - 如何制作一个只允许整数的接口(interface)?

标签 go interface

我想制作一个可以接受任何类似 int 的变量的函数。

例如:

type IntegerType interface {
    int 
}

func MyFunc(arg IntegerType) {
    fmt.Println(arg)
}

这不会编译,因为我不能将接口(interface)继承基于非接口(interface)类型,但这正是我想要做的!

最终目标是这样的:

type Token int
var t Token
t = 3
MyFunc(t)

我如何保证我的参数是一个整数,同时仍然允许整数别名?

最佳答案

How do I guarantee that my argument is an integer, while still allowing integer aliases?

您依赖于类型转换。

func MyFunc(arg int) {
    fmt.Println(arg)
}

type Token int
var t Token
t = 3
MyFunc(int(t))

s := "This is a string, obviously"
MyFunc(int(s)) // throws a compiler error

确实没有必要只为 int 类型定义接口(interface),因为您可以依靠语言类型转换行为在这些类型的场景中强制执行编译时类型安全。

需要注意的一件事是,这比只有 int 的接口(interface)更容易接受。例如,int64 将转换为 int,甚至 float 也会使用典型的舍入约定。无效的转换会产生以下错误; 无法将 s(字符串类型)转换为 int 类型。据我所知,只有 native 数字类型或它们的别名会转换。

关于go - 如何制作一个只允许整数的接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31322541/

相关文章:

C# 多接口(interface)继承不允许具有相同名称的公共(public)访问修饰符

c# - DI、IoC 的五个 W,因为它让我的大脑爆炸

Golang - 删除 Route53 记录

windows - 在 Go 中请求 UAC 提升

pointers - Go 使用指针接收者调用函数的语法

delphi - Delphi编译器什么时候创建隐式接口(interface)变量?

java - 如何创建抽象类和接口(interface)的对象

go - 单元测试 hyperledger fabric 链码 (GetPrivateData)

go - 如何使用 go 从端口 80 无缝地管道/转发到端口 XXXX?

java - 为什么此代码会导致 StackOverflow 错误 :