是创建Go结构字段的惯用方法;别名";只是一个定制的getter?

是创建Go结构字段的惯用方法;别名";只是一个定制的getter?,go,struct,Go,Struct,为了学习这门语言,我正在移植一些Python代码。python代码中完成的一件事是类属性的属性,这些属性为成员访问提供了不同的别名。例如: 类网格: 定义初始化(self,x,y): self.x=x self.y=y @财产 def行(自身): 回归自我 @财产 def列(自身): 返回self.x #用法: a=网格(5,7) a、 行==a.y#真 这允许用户选择哪个表示法((行、列)vs(x、y))对特定代码段最有意义 将此类移植到Go时,最明显的解决方案是结构: 类型网格结构{ 十、

为了学习这门语言,我正在移植一些Python代码。python代码中完成的一件事是类属性的属性,这些属性为成员访问提供了不同的别名。例如:

类网格:
定义初始化(self,x,y):
self.x=x
self.y=y
@财产
def行(自身):
回归自我
@财产
def列(自身):
返回self.x
#用法:
a=网格(5,7)
a、 行==a.y#真
这允许用户选择哪个表示法(
(行、列)
vs
(x、y)
)对特定代码段最有意义

将此类移植到Go时,最明显的解决方案是结构:

类型网格结构{
十、 Y整数
}
主要问题:如果我想为结构创建字段“别名”,那么创建getter的惯用方法是什么?或者,语言中还有其他我不知道的东西吗

我发现了一种叫做I thing的东西,旨在解决一个不同的问题

使用getter:

类型网格结构{
十、 Y整数
}
func(g*Grid)行()int{
返回g.Y
}
func(g*Grid)列()int{
返回g.X
}
//用法
func main(){
g:=网格{5,7}
fmt.Println(“%d”,g.Row())
}

我想你可能还有另一个问题,那就是在不同的上下文中,你似乎需要别名来澄清。问题在于,您对数据类型的命名有缺陷,并导致错误的假设

什么是网格? 您提到了网格、X、Y、行和列,所以让我们以电子表格为例

电子表格将数据组织成一个布局行和列。那么什么是网格呢?网格就是一切

鉴于对网格是什么的理解,当我们看到
grid.X
,它是
int
,我们应该如何假设它的含义?我的假设是,它与x轴上网格的跨度相关联,即柱数。但是,您将其别名为
(单数)。。。有点不对劲

网格的上下文中,一对单数行和单数列与单元格关联

因此,重命名结构可以更好地解决命名问题:

结构单元{ 十、 Y整数 } 或许

结构单元{ 行,列 } (我在这里制作了
uint
,因为负数行/列通常不是一件事)

这里惯用的做法不是制作别名,而是简单地选择最能代表数据内容及其使用方式的名称。虽然两个命名选项非常相似,但它们仍然存在细微的差异,这可能会在考虑使用哪个选项时造成混淆。当你看到两件几乎相同的事情时,你可能会想

我以为我想得到这个单元格的Y值,但现在我看到有一个Row()方法。。。也许这就是我需要的?Y值只是一个原始字段,但是getter方法更安全,对吗?它可能在做某种安全检查。等一下,我想知道基于not的值是否为零。Y听起来更像是从零开始的坐标,但通常行号从1开始计数,不是吗?等等,我又在干什么

关键是,做同样的事情有更多的选择并不一定是件好事。如果需要在特定上下文中将
Col
Row
视为
X
Y
,您可以这样做:

x:=cell.Col
y:=单元格。行

像这样的getter是“好的”,特别是因为它们很可能会在线扩展,因此在运行时除了读者的认知负载之外不会花费任何成本,读者可能会想知道为什么设置X会更改列。但一般来说,围棋并不试图提供16种方法来做某事。(Python最初也没有:@property是在多年后出现的。)你应该认真地问,同一事物有多个名称会让它变得更清楚还是不清楚?你能用一个好的文档注释来完成同样的事情吗?无论如何,在我看来,像这样的获得者是最合适的选择。哦,我同意——名字并不都那么好。然而,我只是想移植一些东西来学习这门语言。考虑到我正在尝试做一个替换,我必须保留坏名字和它们的别名:-(调用代码交替使用
Y
,我需要保留它,直到我可以不推荐为止。哦,作为参考,这与晶圆映射有关(晶圆切割之前晶圆上的半导体芯片)所以
Chip
Die
可能是合适的名称。当有人看到一个getter时,你确实会对思考过程提出很高的要求。