go中一个切片后的括号?

go中一个切片后的括号?,go,slice,Go,Slice,我最近开始学习围棋,并通过一个。本教程中有一行: p1 := &Page{Title: "TestPage", Body: []byte("This is a sample Page.")} 它们有一个定义了括号的切片: []byte("This is a sample Page.") 然而,从我读过的所有文档中,我从来没有看到一个片段后面的括号。我只看到了格式: b := []byte{'g', 'o', 'l', 'a', 'n', 'g'} 使用大括号。括号的作用是什么?来自

我最近开始学习围棋,并通过一个。本教程中有一行:

p1 := &Page{Title: "TestPage", Body: []byte("This is a sample Page.")}
它们有一个定义了括号的切片:

[]byte("This is a sample Page.")
然而,从我读过的所有文档中,我从来没有看到一个片段后面的括号。我只看到了格式:

b := []byte{'g', 'o', 'l', 'a', 'n', 'g'}
使用大括号。括号的作用是什么?

来自规范

将字符串类型的值转换为字节类型的切片将生成一个切片,其后续元素是字符串的字节

[]byte("hellø")   // []byte{'h', 'e', 'l', 'l', '\xc3', '\xb8'}
[]byte("")        // []byte{}

MyBytes("hellø")  // []byte{'h', 'e', 'l', 'l', '\xc3', '\xb8'}
在这里查看完整的转换规则


基于此,虽然这两行代码导致相同的行为,但实际上它们使用的是完全不相关的语言特性。在
[]字节{'l',o',l'}
的情况下,您只是简单地使用复合文字语法进行初始化,这将始终适用于任何类型。在另一种情况下,转换正在发生,除此之外,这是字符串的特殊情况。它看起来更像是被调用的构造函数(从而使它成为复合文字语法的替代品),但这只是巧合。

这绝对是
字节的特例。我不确定它是如何实现的,但是如果你在其他类型中尝试类似的方法,它将无法编译。一旦我追踪到了实际的实现或规范,我会提供一个答案。我想应该是这样的。那很有趣。谢谢大家!@AR7好问题,我很乐意回答。我之所以要更新,是因为我对代码实际上是什么有了一个小小的顿悟。