golang 为 [z][y][x]int 定义数组 int[x][y][z] 有啥好处? [关闭]
Posted
技术标签:
【中文标题】golang 为 [z][y][x]int 定义数组 int[x][y][z] 有啥好处? [关闭]【英文标题】:What is the advantage of golang for defining the array int[x][y][z] for [z][y][x]int? [closed]golang 为 [z][y][x]int 定义数组 int[x][y][z] 有什么好处? [关闭] 【发布时间】:2014-07-07 12:03:02 【问题描述】:我刚开始学习golang
的一些基础知识,看数组定义语法对我来说有点奇怪。
C++/C#/Java 都定义了多维数组,如:
int arr[X][Y][Z]; // C/C++
int[,,] arr = new int[X, Y, Z]; // C#
int[][][] multi = new int[X][Y][Z]; // Java
继续:
var arr [Z][Y][X]int32 // go
语法有什么好处?
【问题讨论】:
语法就是语法。询问优点就像询问德语或英语哪种语法最好。 就像帕斯卡。变量名不在类型定义的中间。 不相关: 多维数组很糟糕(除非你正在使用数学/科学的东西,而你实际上是want
来表示 n 维数据)几乎每次我我们已经在代码中看到了一个多维数组,它被用作应该是适当对象模型的数据存储。确保为您的数据使用正确的数据结构,请不要使用多维数组来放置人们的姓氏和年龄。
@JoachimPileborg 我不会完全同意。与自然语言相反,编程语言是经过设计的。所以对他们来说,这个或那个背后的基本原理问题更有意义。
多维数组不烂;它们可以以糟糕的方式使用(就像其他任何东西一样)。它们比数组数组方便得多。例如,考虑一个(数学)矩阵。
【参考方案1】:
C# 和 Java 的语法都受到 C 的启发,并继承了 C 语法的所有特点。关于为什么Go has a different syntax 有一篇很好的文章:
Go 语法
C 家族以外的语言通常使用不同的类型语法 声明。虽然它是一个单独的点,但名称通常会出现 首先,通常后面是冒号。因此我们上面的例子变成了 类似的东西(用虚构但说明性的语言)
x: int p: pointer to int a: array[3] of int
这些声明很清楚,如果冗长的话 - 你只需阅读它们 对。 Go 从这里得到它的提示,但为了简洁起见 删除冒号并删除一些关键字:
x int p *int a [3]int
[3]int
的样子和怎么做没有直接对应关系 在表达式中使用 a。 (我们将在下一节中回到指针 部分。)以单独的语法为代价获得清晰度。
【讨论】:
已经阅读了 Pike 的文章,Go's declarations read left to right. It's been pointed out that C's read in a spiral! See The "Clockwise/Spiral Rule" by David Anderson.
不过我很难从左到右阅读数组定义。
@Gohan 这需要一段时间,但很快就会变得非常明显。 [5]int 只是 5 个整数的数组。按照你说的顺序写下来。【参考方案2】:
这种variable declaration(var
)的另一个方面是它被初始化为一个zero value
此初始化是递归完成的,因此例如,如果未指定任何值,则结构数组的每个元素都将其字段归零。
declaration is "backward" (coming from C):
在 C 中,这个概念是将变量声明为表示其类型的表达式,这是一个好主意,但类型和表达式语法不能很好地混合,结果可能会令人困惑;考虑函数指针。
Go 主要将表达式和类型语法分开并简化了事情(使用前缀 * 作为指针是证明规则的例外)
【讨论】:
以上是关于golang 为 [z][y][x]int 定义数组 int[x][y][z] 有啥好处? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
【向大虾求助,C语言编程问题,C++】输入三个int整数x,y,z,请把这三个数由小到大输出。(注
定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Complex(int i,int j) 显示复数