繁体   English   中英

创建没有make的Go切片

Creating a Go slice without make

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

nums := []int{2, 3, 4}

这有什么作用? 我在创建数组还是切片?

从这个: https//gobyexample.com/range ,它说切片。 但我认为这是一个阵列。

3 个回复

由于您没有指定长度,因此它是一个切片。

数组类型定义指定长度和元素类型:请参阅“ Go Slices:usage和internals

http://blog.golang.org/go-slices-usage-and-internals_slice-array.png

除了遗漏元素计数之外,slice文字声明就像数组文字一样。

虽然可以使用名为make的内置函数创建切片,但您使用文字形式创建切片。

创建的切片的内部与数组不同:

make([]byte, 5)

http://blog.golang.org/go-slices-usage-and-internals_slice-1.png

实际上通过这样做:

nums := []int{2, 3, 4}

您正在创建两个 :数组切片。 但由于它是切片文字 ,结果将是切片类型,因此nums的类型是[]int ,您可以使用此代码验证:

fmt.Printf("%T", nums) // Output: []int

会发生的是,数组将在后台自动创建/分配,长度为3,并使用列出的元素进行初始化,并且将创建一个参考数组的切片,此切片将是表达式的结果。

引用Go语言规范:复合文字

切片文字描述整个基础数组文字。 因此,切片文字的长度和容量是最大元素索引加1。 切片文字具有形式

 []T{x1, x2, … xn} 

并且是应用于数组的切片操作的简写:

 tmp := [n]T{x1, x2, … xn} tmp[0 : n] 

Array文字还包括长度,例如:

arr := [3]int{1, 2, 3}
arr2 := [...]int{1, 2, 3} // Length will be computed by the compiler
fmt.Printf("%T", arr)  // Output: [3]int
fmt.Printf("%T", arr2) // Output: [3]int

在go中, 数组类型包括它们的长度 由于您省略了长度,因此它是一个切片

array := [3]int{1, 2, 3} // Array since it includes length (3).
slice := array[:] // Slice since there is no length specified.

fmt.Printf("%#v - %T\n", slice, slice) // %T means "type".
fmt.Printf("%#v - %T\n", array, array)
// [3]int{1, 2, 3} - [3]int
// []int{1, 2, 3} - []int

在上面的示例中,我们通过将其设置为array的整个范围来创建切片而不调用“make”。 如果您要编辑arrayslice则两者都将更改,因为“切片”本质上是存储为“数组”的视图。

slice[0] = 456 // And array[0] == 456
array[0] = 789 // And slice[0] == 789
1 为什么使用 make() 在 Go 中创建切片?

var a [4]int和b := make([]int, 4)什么区别? b可以扩展,但不能扩展a ,对吗? 但是如果我知道我真的需要 4 个元素,那么数组是否比切片更快? var d []int和e := make([]int)之间有什么性能差异吗? f := make([]in ...

2013-02-24 02:34:47 1 1935   go
2 在go中创建一片切片

我试图创建一个返回所有的功能key, value一的map作为slice的slice元组(其中每个元组是{key, value} ) 这是代码: 但是我收到toReturn行的错误: 我应该如何声明一片接口? 我认为这是唯一的方法。 我尝试没有括号,如: 但它也 ...

3 切片数组 - GO

1) 对于下面的切片声明, 创建一个指向 3 个字符串数组的切片( a ), len(a) = 3和cap(a) =3但不是cap(a) >= 3 创建 5 个切片,其中每个切片(例如a[0] )指向 3 个字符串的数组, len(a[0]) = 3和cap(a[0]) = 3 ...

4 在Go中切片

因此,我尝试对每4个字节中的4个字节进行异或运算。 问题是,我想将random更改为ans(这是xor的结果),然后继续进行。 因此,基本上,随机变量第一次将为固定数字,但之后将更改,直到循环结束。 我的代码似乎具有正确的逻辑,但是,我不断得到(运算符^未在slice上定义) 我的 ...

6 使用Go中的反射创建指针切片

我已经看过几个关于这个主题的反思的例子,但我找不到解决这个问题的任何东西。 感觉有点复杂,但另一种选择是大量的重复,所以我想我会试一试。 我有一个函数返回一个函数(处理程序)。 包装函数传入struct的实例。 我需要内部函数来创建一个指向该结构类型的指针: ...

7 在 Go 中创建 2D 切片的简洁方法是什么?

我正在通过A Tour of Go学习围棋。 那里的一个练习要求我创建一个包含uint8的dy行和dx列的二维切片。 我目前有效的方法是: 我认为遍历每个切片来初始化它太冗长了。 如果切片有更多维度,代码将变得笨拙。 有没有一种简洁的方法来初始化 Go 中的 2D(或 n 维)切片? ...

2016-10-01 09:11:00 3 120701   go/ slice
8 在Go中,如何使用切片创建泛型函数?

假设我想编写一个在切片中找到值的函数 我直觉地想写: 但是我无法用Go做到这一点。 我可以有一个界面 这会起作用,但在我的真实代码中,事情变得更复杂(我需要做片段[from:end]等),追加,等等,如果我在界面中重新定义所有这些,我最终会有很多代码。 有没有更好的办法 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM