登录
首页 >  Golang >  Go问答

使用方法取代函数有哪些优点?

来源:stackoverflow

时间:2024-03-04 13:51:25 370浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《使用方法取代函数有哪些优点?》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

问题内容

我正在开发“matrix”结构体和相关方法,目的是为了练习go。 我做了很多方法,但我意识到所有这些方法都可以变成函数 我习惯了c++,在c++中,如果我创建一个参数是类类型的函数,则该函数不能使用该类的私有变量(信息隐藏) 但是,当我使用“go”构建类似的代码时,函数可以访问结构体的变量。 所以我不明白 go 中的方法和函数有什么不同。 使用方法而不是函数是否有任何利润,反之亦然?

第一个是我原来的“matrix”代码(不是全部) 它使用了一种方法“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

第二个是另一个类似的代码。 (除了“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

解决方案


如果您只想调用函数或方法,没关系,您可以创建一个带有签名的函数,其中接收者是普通的常规参数。不会有任何性能损失(如果方法可以是 virtual,则可能会有任何性能损失,但在 go 中没有虚拟方法)。

其中一个优势可能是“视觉吸引力”。调用一个方法可以明显看出它属于接收者。我还发现如果使用方法,链式代码更容易理解。

比较这个没有方法的解决方案:

type circle struct{}
type point struct{}

func center(circle) point { return point{} }
func abs(point) float64   { return 0 }

func main() {
    var c circle
    fmt.println(abs(center(c)))
}

abs(center(c)) 并不那么直观。但是如果您添加方法而不是使用函数:

func (Circle) Center() Point { return Point{} }
func (Point) Abs() float64 { return 0 }

func main() {
    var c Circle
    fmt.Println(c.Center().Abs())
}

c.center().abs()更容易理解。

如果要实现接口,方法是必须的。如果接口包含某些方法,则只有具有这些方法的类型才能实现它。请参阅相关:Why are interfaces needed in Golang? 还应该注意的是,您只能创建在同一包中定义的方法,因此如果您想“武装”来自不同包的类型,则无法“使用”方法。

有一件事我称之为使用方法的“利润”:你不能按名称调用函数,但你可以按名称访问和调用方法。详情请参见Call functions with special prefix/suffix

今天关于《使用方法取代函数有哪些优点?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>