自定义类型作为参数传递给函数

2024-02-22

当我定义自定义类型时,基础类型的类型似乎对我是否可以将其按原样传递给函数或是否需要转换它产生影响。

问题是:为什么RuneFunc and StringMap工作,但不Integer?

https://play.golang.org/p/buKNkrg5y- https://play.golang.org/p/buKNkrg5y-

package main


type RuneFunc func(rune) rune
type Integer int
type StringMap map[string]string

func main() {
    //m := make(StringMap)
    //mf(m)


    var i Integer = 5
    nf(i)


    //var f func(rune) rune
    //ff(f) 

}

func mf(i map[string]string) {

}
func ff(i func(rune)rune) {

}
func nf(i int) {

}

在这里,当我运行这个名为nf with Integer它抱怨虽然int是基础类型。但当我打电话时mf or ff他们运行成功。


Integer and int

int和你的新类型Integer是两种不同的、不同的类型。在哪里Integer预计,您必须传递类型的值Integer.

如果你有一个Integervalue,您可以使用简单的类型转换使其成为 type 的值int,因为底层类型Integer is int:

var i Integer = 5
nf(int(i))

同时可能令人困惑和有趣的是,您可以传递一个无类型常量而不进行转换:

nf(5)

尝试这些去游乐场 https://play.golang.org/p/M4w1kKmD9A.

其原因在于规格: 可分配性: https://golang.org/ref/spec#Assignability

A value x is 可分配的 to a variable https://golang.org/ref/spec#Variables类型的T ("x可分配给T") 在任何这些情况下:

[...]

  • x是一个无类型的constant https://golang.org/ref/spec#Constants可以用类型值表示T.

5是一个无类型常量,可由类型值表示int因为无类型常量5 has a 默认类型 https://golang.org/ref/spec#Constants int,所以它可以用类型的值表示Integer(具有相同的默认类型)。

如果您检查其他可分配性规则(未包含在上面的引用中),它们都不符合您尝试传递值的情况Integer对于类型参数int,所以这是不允许的。

查看相关问题:Golang:创建常量类型并限制类型的值 https://stackoverflow.com/questions/37385007/golang-creating-a-constant-type-and-restricting-the-types-values/37386119#37386119

RuneFunc and func(rune) rune

本例与上一例的区别(Integer and int) 就是它int is a 命名类型 https://golang.org/ref/spec#Types and func(rune) rune is not.

并且有一个可分配性规则允许这样做:

  • x's type V and T有相同的底层类型 https://golang.org/ref/spec#Types并且至少其中之一V or T不是一个命名类型 https://golang.org/ref/spec#Types.

所以在这种情况下:

var f RuneFunc
ff(f)

f是一个命名类型,但是参数类型ff() is func(rune) rune这是未命名的,因此允许分配。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义类型作为参数传递给函数 的相关文章

  • 在 golang 中将 []uint32 转换为 []byte,反之亦然

    最有效的 性能 转换方式是什么 uint32向和从 byte在戈兰 例如 func main source uint32 1 2 3 dest make byte 4 len source source to dest check len
  • 从 GUID 获取类型

    由于种种原因 我需要在C 中实现类型缓存机制 幸运的是 CLR 提供了Type GUID来唯一标识一个类型 不幸的是 我找不到任何方法来根据此 GUID 查找类型 有Type GetTypeFromCLSID 但根据我对文档 和实验 的理解
  • 在 Go 中解析多个 JSON 对象

    可以使用以下方法轻松解析如下对象encoding json包裹 something foo something else bar 我面临的问题是当服务器返回多个字典时 如下所示 something foo something else ba
  • 一般处理枚举的 Scala 类

    我想创建一个通用类来保存枚举的值 并且还允许访问枚举的可能值 以属性编辑器为例 您需要知道属性的当前值 并且还需要能够知道该属性的其他合法值 并且枚举的类型不应该提前知道 您应该能够使用任何类型的枚举 我的第一个想法是这样的 class E
  • 为什么 Go 中不允许在包级别声明短变量?

    这是允许的 package main var a 3 但这不是 package main a 3 为什么不 为什么不能将函数外部的短变量声明视为没有类型的常规声明 只是为了简化解析 根据伊恩 兰斯 泰勒的说法这个线程 https group
  • Golang:从文本文件中替换字符串中的换行符时出现问题

    我一直在尝试读取一个文件 然后将读取的材料放入字符串中 然后字符串将按行分割成多个字符串 absPath filepath Abs Go input txt data err ioutil ReadFile absPath if err n
  • 将 SQL Server varBinary 数据转换为字符串 C#

    我需要帮助弄清楚如何转换来自SQL服务器表列设置为varBinary 最大 转换为字符串以便将其显示在标签中 这是在C 我正在使用数据读取器 我可以使用以下方式提取数据 var BinaryString reader 1 我知道该列包含之前
  • Go 中的数据竞争:为什么会在 10-11 毫秒以下发生?

    这是我运行的代码 package main import fmt time const delay 9 time Millisecond func main n 0 go func time Sleep delay n fmt Printl
  • 如何访问主包之外的标志?

    We 解析标志 http golang org pkg flag FlagSet Parse当然 在 main 包中的 main go 中 然后我们有另一个包 我们想在其中读取一些标志的值 flags Args http golang or
  • 如何从 golang fyne 容器中删除对象

    我正在开发 GUI 应用程序 需要动态添加和删除 gui 元素 我想知道是否有办法从 golang fyne 容器中删除元素 在下面的示例代码中 我创建了容器并动态添加元素 现在我希望能够删除这些元素而不是隐藏它们 我尝试的一个 解决方案
  • 是否可以将 Go 代码作为脚本运行?

    随着Go正在成为 系统 的语言 我想知道是否可以将 Go 代码作为脚本运行而不编译它 有可能这样做吗 动机 因为有关于动机的问题 取自如何使用 Scala 作为脚本语言 http alvinalexander com scala how t
  • 记录 http.ResponseWriter 内容

    Premise 我发现了类似的问题 但不适用于我的情况 因此请不要将其标记为重复 我在 Go 中有一个 HTTP 服务器 并且创建了一个中间件记录请求 响应时间 我也想记录响应 我用过httputil DumpRequest在一个名为的函数
  • 带有导出字段的私有类型

    在 Go 教程的第二天有这样的练习 为什么拥有带有导出字段的私有类型会很有用 例如 package geometry type point struct X Y int name string 请注意point是小写的 因此不会导出 而字段
  • Goroutine 是如何工作的? (或者:goroutines 和操作系统线程的关系)

    其他 goroutine 如何在调用系统调用时继续执行 当使用 GOMAXPROCS 1 时 据我所知 当调用系统调用时 线程会放弃控制权 直到系统调用返回 Go 如何在不为每个阻塞系统调用 goroutine 创建系统线程的情况下实现这种
  • 隐式类型转换 - 编译器错误

    这个问题与this https stackoverflow com questions 3529449 can i make the ternary operator treat my class like a bool问题 下面的代码在V
  • 命名和未命名类型

    问题 我最近开始阅读Golang规格手册 https golang org ref spec并陷入试图理解的困境有名和无名类型在相关部分 https golang org ref spec Types 我来自动态语言 这让我有点头疼 手册指
  • 正则表达式不匹配

    我正在尝试以下代码 d byte x01 x00 x00 x00 x00 x00 x00 x00 x00 x00 x00 x80J x13 x80SQ x80L xe0 x80 x92 x80L x80H xe0 r regexp Must
  • 在 Go 中读取请求负载?

    我正在使用文件上传器 需要请求负载中的详细信息来裁剪它 func Upload w http ResponseWriter r http Request reader err r MultipartReader if err nil htt
  • 使用新的定义文件添加到现有库打字稿类型

    我正在使用这个库https github com chentsulin koa bearer token https github com chentsulin koa bearer token它向 koa 库请求对象添加了一个额外的属性
  • 为什么类型级计算需要 Aux 技术?

    我很确定我在这里遗漏了一些东西 因为我对 Shapeless 还很陌生并且我正在学习 但是 Aux 技术实际上是什么时候required 我看到它是用来暴露type通过将其提升为另一个 同伴 的签名来声明type定义 trait F A t

随机推荐

  • 从 asp.net/C# 查询 MUMPS

    有谁知道如何使用 C 从 MUMPS 数据库查询而不使用 KBSQL ODBC 我们需要从 MUMPS 数据库 Mckesson STAR Patient care 进行查询 当我们使用 KBSQL 时 它仅限于 6 个并发用户 因此我们尝
  • 如何回收/重用 CUDA 线程

    在 CUDA 中 如何为内核中的所有线程创建一个等待的屏障 直到CPU向该障碍发送一个信号 表明继续进行是安全的 有帮助的 我想避免启动 CUDA 内核的开销 有两种类型的开销需要避免 1 在 X 块和 Y 线程上简单启动内核的成本 以及
  • 如何在角度4中以动态形式设置ngIf动态条件

    我正在创建一个动态表单 在其中根据 JSON 的响应动态填充字段 Eg type text required true minlength 3 maxlength 5 name fname visibility true type text
  • 有没有办法使用 HashWithIn DifferentAccess 序列化 ActiveRecord 的 JSON 属性?

    我在用ActiveRecord ConnectionAdapters PostgreSQLAdapter在 Rails 应用程序中 假设我有一个架构 create table foo id bigserial force cascade d
  • 如果未发送,请重试发送邮件

    我正在使用 nodemailer 通过我的节点应用程序发送电子邮件 有时电子邮件不起作用并抛出错误 直到我尝试两次或三次 我希望我的程序一次又一次地尝试 直到邮件成功发送 这是我的代码 const mailOptions from from
  • Django 锁定身份验证 - 登录表单不起作用

    我一直在研究锁定整个页面的方法 一位同事引起了我的注意Django 锁定 https bitbucket org carljm django lockdown src 我已经安装了 我的代码如下所示 INSTALLED APPS lockd
  • jQuery 如何获取元素的边距和填充?

    只是想知道 如何使用 jQuery 我可以获得格式化的总填充和边距等元素 即 30px 30px 30px 30px 或 30px 5px 15px 30px 等 I tried var margT jQuery img css margi
  • StreamingFileSink 未将数据提取到 s3

    我创建了简单的摄取服务 该服务选择本地文件并使用 StreamingFileSink 摄取到 s3 https ci apache org projects flink flink docs stable dev connectors st
  • Java 的快速超越/三角函数

    由于 java lang Math 中的三角函数非常慢 是否有一个库可以快速且良好地近似 似乎可以在不损失太多精度的情况下以数倍的速度进行计算 在我的机器上 乘法需要 1 5ns 而 java lang Math sin 需要 46ns 到
  • 在开始/结束日期将记录拆分为多个记录

    我正在寻找一种解决方案 必须使用另一个表中的数据从一个记录创建一组记录 表定义 DECLARE A AS TABLE AID BIGINT NOT NULL StartDate DATETIME NOT NULL EndDate DATET
  • 如何用SASS将数字转换为百分比? [复制]

    这个问题在这里已经有答案了 我有一张 930 像素 x 530 像素的地图 我想使用 mixin 将纬度 经度坐标转换为框内的顶部 左侧百分比值 这就是我到目前为止所拥有的 mixin latLong lat long left long
  • 使用 PHP 检测日历事件重叠冲突

    我正在开发一项功能 用于检查外部事件是否与内部事件 在日历应用程序中 发生冲突 该过程如下所示 我的应用程序创建了一系列可能的事件 称为 internalEvents 我从 Google Calendar iCloud 等日历 称为 ext
  • 如何捕获或收听浏览器通知?

    我想在 chrome 浏览器上收听 google facebook whatsapp 等网站的传入通知 我看到黑客提到here https stackoverflow com questions 15949606 how can i lis
  • Jquery Tablesorter,按链接url而不是链接内容排序

    我在一个表上使用 Tablesorter 该表使用第一列 共 4 列 中的链接 问题是 在 FF 和 Chrome 中 当通过 url 单击时 它会排序第一列 而不是链接的内容 例如 tr td a href http abc com zz
  • 在proguard中,保存包/默认访问变量和方法的关键字是什么?

    你可以说 keepclassmembers class sun public protected 但我并不排除包 默认访问方法 void myMethod 您可以添加另一个 keepclassmembers像那样 keepclassmemb
  • 如何在Vega JS中实现树节点切换?

    我在用着Vega JS https vega github io vega用于构建树形图 总的来说 我的问题如下 Vega 文档有很棒的树形布局示例 https vega github io vega examples tree layou
  • 如何使用 python opencv 测量同一图像中两条线之间的角度?

    我使用霍夫变换检测到一条不直的车道边界线 然后单独提取该线 然后与另一个具有直线的图像混合 现在我需要计算这两条线之间的角度 但我不知道这些线的坐标 所以我尝试使用给出垂直线坐标的代码 但它无法具体识别这些坐标 有没有办法测量这些线之间的角
  • 我应该如何查询 MySQL 以及如何缓存 MySQL 的结果?

    在你们所有人的帮助下 我终于成功地让 Solr 工作了 所以谢谢你们 而且我不得不说 我现在明白你为什么推荐它了 它真的很强大 现在 说到问题 我已将所有 可搜索 信息编入索引Solr 我的计划是查询 Solr 然后得到ID s查询结果 所
  • 如何仅在构建时排除打字稿中的特定文件?

    是否可以排除仅用于构建的所有测试文件 但将它们与 nodemon 一起使用以在本地运行测试 当我排除测试文件时tsconfig json在我的例子中 我收到一个打字稿错误 它找不到像 jest 这样的测试库的类型 Cannot find n
  • 自定义类型作为参数传递给函数

    当我定义自定义类型时 基础类型的类型似乎对我是否可以将其按原样传递给函数或是否需要转换它产生影响 问题是 为什么RuneFunc and StringMap工作 但不Integer https play golang org p buKNk