三个点是否包含多个含义?

2024-01-04

据我所知,“...”表示下面代码片段中数组的长度。

var days := [...]string { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" } 

另一方面,“...”表示解包切片y正如我猜测的,下面代码片段中 int 的参数。我对此不太确定。

x := []int{1,2,3}
y := []int{4,5,6}
x = append(x, y...)

现在,这两种含义的差异让我很难理解“……”是什么。


您已经注意到两个案例...在围棋中。其实有3种:

[...]int{1,2,3}

评估在编译时至 [3]int{1,2,3}

a := make([]int, 500)
SomeVariadicFunc(a...)

Unpacks a作为函数的参数。这与您错过的可变参数定义相匹配:

func SomeVariadicFunc(a ...int)

现在进一步的问题(来自OP的评论)——为什么……在所有这些情况下都可以在语义上起作用?答案是,在英语(和其他语言)中,这被称为ellipsis http://en.wikipedia.org/wiki/Ellipsis。从那篇文章

省略号(复数省略号;源自古希腊语:ἔλλειψις, élleipsis,“遗漏”或“未达标”)是一系列点, 通常表示故意省略单词、句子或 文本的整个部分而不改变其原始含义。1 http://en.wikipedia.org/wiki/Ellipsis根据其上下文和在句子中的位置,省略号可以 也表示未完成的想法、主要陈述、轻微的 停顿,以及紧张或尴尬的沉默。

在数组情况下,这与“省略单词、句子或整个部分”定义匹配。您忽略了数组的大小并让编译器为您计算出来。

在可变参数情况下,它使用相同的含义,但不同。它还带有“未完成的想法”的暗示。我们经常使用“...”来表示“等等”。 “我要去买面包、鸡蛋、牛奶……”在这种情况下,“……”表示“类似于面包、鸡蛋和牛奶的其他东西”。使用在,例如,append意思是“这个列表中的一个元素,以及所有其他元素”。这也许是不太直观的用法,但对于母语人士来说,这是有道理的。也许更“语言纯粹”的结构是a[0]...甚至a[0], a[1], a[2]...但这会导致空切片出现明显的问题(这确实适用于...语法),更不用说冗长了。

一般来说,“...”用来表示“许多事情”,这样它的两种用法都是有意义的。许多数组元素,许多切片元素(尽管一个是创建,另一个是调用)。

我想隐藏的问题是“这是好的语言设计吗?”一方面,一旦你了解了语法,它对于大多数以英语为母语的人来说都是完全有意义的,所以从这个意义上说它是成功的。另一方面,不以这种方式重载符号是有价值的。我可能会选择不同的符号来进行数组解包,但我不能责怪他们使用了语言设计者可能直观的符号。特别是因为数组版本甚至不经常使用。

如前所述,这对编译器来说不是问题,因为案例永远不会重叠。你永远不可能拥有[...]也意味着“解压这个”,所以不存在符号冲突。


(旁白:我省略了 Go 中它的另一种用法,因为它不在语言本身中,而是在构建工具中。输入类似go test ./...意思是“测试这个包,以及这个包的子目录中的所有包”。但通过我对其他用途的解释应该非常清楚为什么它在这里有意义。)

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

三个点是否包含多个含义? 的相关文章

  • 共享来自单独命令/进程的属性

    我提供带有多个命令和子命令的命令行工具 我使用cobra https github com spf13 cobra命令行 我有两个单独的命令首先是前提条件e 给其他人 例如第一个命令是通过创建临时文件夹并验证某些文件来首选环境 第二个命令应
  • 为什么我的 SQL 占位符没有被替换(使用 Go pq)?

    根据文档 我正在这样做 var thingname string asdf var id int err database QueryRow SELECT id from things where thing thingname Scan
  • 视频第一帧

    我正在创建一个单页应用程序 后端使用 Golang 前端使用 javascript 我想找到一种使用 Golang 获取视频第一帧的方法 首先 我将 mp4 视频文件上传到服务器 它保存在服务器上 有没有办法使用 Golang 获取该视频的
  • 在函数中将通道作为参数传递的不同方法

    我正在阅读一些Go代码 并说了几种传递Go通道的不同方法 也许它们是相同的 但我想知道是否有任何区别 因为我无法在线找到文档 1 func serve ch lt chan interface do stuff 2 func serve c
  • Go 的范围不能超过 (类型接口 {})

    我正处于尝试将我的注意力集中在 Go 上的婴儿阶段 目前 我正在模拟一个 API 请求 该请求返回包含对象数组的 JSON 格式的字符串 我试图找出迭代每个记录并访问每个字段的最合适的方法 最终 每个字段都将写入 Excel 电子表格 但现
  • golang mongodb (mgo) 没有插入文档

    我在使用 mgo 在 mongodb 中保存 golang 结构时遇到问题 type AN Track Log struct Id bson ObjectId bson id omitempty user session id str st
  • bazel go_embed_data“无法嵌入”

    我将以下 bazel BUILD 配置为 gazelle name gazelle go embed data name static files srcs glob static package main var staticFS go
  • 使用 StructScan 将 postgresql 数组获取到结构中

    测试数据 CREATE TABLE test id int data text INSERT INTO test id data VALUES 1 a b c 去代码吧 第一个 一个运行良好的 func main db sqlx Open
  • 尝试使用 pkg-config 但它不是注册命令

    好的 我已经在 Windows 8 下建立了整个 Go 开发环境 也使用了 MinGW 我正在使用LiteIde C Go bin go exe build C Users Alyx Go Hi pkg config cflags sdl
  • 如何通过map[string]interface{}递归迭代

    我遇到了一个问题 如何在附加条件下递归地迭代 map string interface 1 如果一个值是一个映射 递归调用该方法 2 如果一个值是一个数组 调用数组的方法 3 如果一个值不是一个映射 处理它 现在当方法尝试执行时doc th
  • Golang SSL TCP套接字证书配置

    我正在创建一个 Go TCP 服务器 不是 http s 并且尝试将其配置为使用 SSL 我有一个 StartCom 免费 SSL 证书 我正在尝试使用它来完成此任务 我的服务器代码如下所示 cert err tls LoadX509Key
  • 如何避免 Google App Engine 标准环境中 Gorilla 会话的内存泄漏?

    我正在使用 Gorilla 在 Google App Engine 上启用会话变量 到目前为止 我只导入了 github com gorilla sessions 但 Gorilla 的页面显示 如果您不使用 gorilla mux 则需要
  • http:多余的response.WriteHeader调用

    我有一个HandleFunc 如果成功的话 我希望 显然 能够 sent a 200回复 在回复中写一条信息性消息 但是以下代码片段 在快乐路径中执行 if fullRun w Write byte successMsg w WriteHe
  • 如何最大限度地减少 Go 中的垃圾收集?

    有时您可能想避免 最小化垃圾收集器 所以我想确定如何做到这一点 我认为下一个是正确的 在函数的开头声明变量 使用数组代替切片 还有吗 为了最大限度地减少 Go 中的垃圾收集 您必须最大限度地减少堆分配 为了最大限度地减少堆分配 您必须了解分
  • golang 将 big.Float 转换为 big.Int

    将big Float转换为big Int 我在下面编写代码 但它溢出了uint64 那么将big Float转换为big Int的正确方法是什么 package main import fmt import math big func Fl
  • 在 Go 中传递任意函数作为参数

    我正在尝试扩展我对 Go 函数指针的了解 并且我有一个问题 在 Go 中将函数作为参数传递可以做什么 不可以做什么 假设我想写一个decorator 可以包装任何现有函数的函数 为简单起见 我们将其限制为仅接受一个参数并仅返回一个值的函数
  • 使用指针接收器调用函数的 Go 语法

    在Go中 如果我定义一个带有指针的函数作为接收者 它是否应该只允许从指针调用该函数 为什么从值本身调用这个函数就可以 并且有同样的效果 例如 在以下程序中 m1 reset 和 m2 reset 具有相同的效果 即使 m1 是一个值而 m2
  • Golang 使用 gomail.v2 实现多个收件人

    我通过 gomail v2 发送电子邮件的唯一方法是在 for 循环中对每封电子邮件使用 Send 函数 但我需要向其他电子邮件地址显示已发送相同的电子邮件 for recipient range os Args 3 mail SetAdd
  • Golang 处理数据库连接的“最佳实践”

    我有一个用 Go 编写的 Web 服务 目前我有一个全局包 我可以在任何地方导入它 其中包含与 MongoDB 的连接 通过 MGO 但我不得不说 这对我来说感觉非常恶心 在 Go 中维护与数据源的连接的最佳实践是什么 我来自 PHP 世界
  • Go中通过反射给struct成员赋值

    我有一个结构 v 其中包含成员 A B C 字符串 使用反射 我可以获得字段的名称及其值 typ v Type for i 0 i lt v NumField i gets us a StructField fi typ Field i f

随机推荐