登录
首页 >  Golang >  Go问答

Golang 方法接收器与普通函数参数的比较

来源:stackoverflow

时间:2024-02-12 21:09:22 102浏览 收藏

一分耕耘,一分收获!既然都打开这篇《Golang 方法接收器与普通函数参数的比较》,就坚持看下去,学下去吧!本文主要会给大家讲到等等知识点,如果大家对本文有好的建议或者看到有不足之处,非常欢迎大家积极提出!在后续文章我会继续更新Golang相关的内容,希望对大家都有所帮助!

问题内容

我很困惑什么时候应该将我的值作为接收者传递,什么时候应该在我的函数中使用该值作为参数。我的main.go文件如下所示:

package main

import "fmt"

type tennumbers []int

func main() {

    arrayoften := newarrayonetoten()

    arrayoften.print()

}

// not a receiver function because you are not receive anything
func newarrayonetoten() tennumbers {
    mynumbers := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

    return mynumbers
}

// receiver function because you receive the array
func (t tennumbers) print() {
    for _, value := range t {
        if value%2 == 0 {
            fmt.println(value, "even")
        } else {
            fmt.println(value, "odd")
        }
    }
}

如果我将函数更改为传入 int 切片作为参数,它仍然可以如下所示工作。 :

package main

import "fmt"

type tenNumbers []int

func main() {

    arrayOfTen := newArrayOneToTen()

    print(arrayOfTen)

}

// not a receiver function because you are not receive anything
func newArrayOneToTen() tenNumbers {
    myNumbers := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

    return myNumbers
}

// receiver function because you receive the array
func print(t tenNumbers) {
    for _, value := range t {
        if value%2 == 0 {
            fmt.Println(value, "even")
        } else {
            fmt.Println(value, "odd")
        }
    }
}

这两个有区别吗?我很困惑何时应该使用接收器或参数?


正确答案


区别在于,在第一种情况下,类型 tenNumbers 在其 method set 中将有一个 print() 方法,在第二种情况下则不会。

如果您只想运行该函数,这并不重要:您可以使用这两种解决方案。

如果必须实现接口,并且函数属于该类型,则使用方法,这可以使代码更有组织性。请参阅:Functions as the struct fields or as struct methods

另请注意,函数不能在运行时通过名称访问,但方法可以。请参阅:Call functions with special prefix/suffix

关于泛型的另一个考虑因素是方法不能引入新的类型参数,只能“使用”type definition 中列出的类型参数。函数可以引入新的类型参数。请参阅:How to create generic method in Go? (method must have no type parameters)

终于介绍完啦!小伙伴们,这篇关于《Golang 方法接收器与普通函数参数的比较》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

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