【发布时间】:2019-10-01 06:17:00
【问题描述】:
为了练习围棋,我正在开发“矩阵”结构和相关方法。 我做了很多方法,但我意识到所有这些方法都可以变成函数 我习惯了 C++,在 C++ 中,如果我创建一个参数是类类型的函数,该函数不能使用该类的私有变量(信息隐藏) 但是,当我使用“Go”构建类似的代码时,函数可以访问结构的变量。 所以我不明白 Go 中的方法和函数有什么不同。 使用方法而不是函数是否有任何利润,反之亦然?
第一个是我原来的“矩阵”代码(不是全部) 它使用了一种方法“Tr”。 它没有问题。
package main
import "fmt"
//definition of "Array"
type Array struct{
component [][]float32
row int
col int
}
//constructor of Array, "Ones"; making an array setting all component as one
func Ones(m int, n int) Array{
var a Array
a.component = make([][]float32, m)
a.row=m
a.col=n
for i:=0; i<m; i++{
a.component[i] = make([]float32, n)
for j:=0; j<n; j++{
a.component[i][j]=1
}
}
return a
}
//Tr function; find trace of an Array
func (a Array) Tr() float32{
var sum float32 = 0
for i:=0; i<a.row; i++{
sum += a.component[i][i]
}
return sum
}
func main(){
a := Ones(3,3)
fmt.Println(a.Tr())
}
第二个是另一个类似的代码。 (一切都一样,但“Tr”部分) 它只使用函数。 它也没有问题。
package main
import "fmt"
//definition of "Array"
type Array struct{
component [][]float32
row int
col int
}
//constructor of Array, "Ones"; making an array setting all component as one
func Ones(m int, n int) Array{
var a Array
a.component = make([][]float32, m)
a.row=m
a.col=n
for i:=0; i<m; i++{
a.component[i] = make([]float32, n)
for j:=0; j<n; j++{
a.component[i][j]=1
}
}
return a
}
//Tr function; find trace of an Array
func Tr(a Array) float32{
var sum float32 = 0
for i:=0; i<a.row; i++{
sum += a.component[i][i]
}
return sum
}
func main(){
a := Ones(3,3)
fmt.Println(Tr(a))
}
【问题讨论】:
-
Go 中没有方法之类的东西。只有功能。我想这回答了这个问题。
-
来自here:“方法是具有特殊接收器参数的函数。”
-
@MarkusWMahlberg 有趣的是,Go 语言规范有关于方法声明、方法表达式、方法值和方法集的部分。
-
@MarkusWMahlberg 我们并不是说方法不是函数,甚至您的引文也说方法是事物,所以说它们不存在是很苛刻的。