为了账号安全,请及时绑定邮箱和手机立即绑定

方法 vs 函数用法 golang

方法 vs 函数用法 golang

Go
炎炎设计 2021-12-07 18:32:24
我知道 func 和 method 之间的区别。但我对以下之间的用法感到困惑:prod:=Product{"title","brand","model"}prod.Add()或者:prod:=Product{"title","brand","model"}products.Add(&prod) // products is package
查看完整描述

3 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

这是两种不同的情况,一种是方法属于Product实例,一种是全局函数属于products包。


type Product struct {

        Title string

        Brand string

        Model string

}


// This method add value to a field in Product

func (p *Product) Add(field, value string) {

        switch field {

        case "Title":

                p.Title = value

        case "Brand":

                p.Brand = value

        case "Model":

                p.Model = value

        }

}

上面提供了一个方法来给自己添加值作为 的一个实例Product,即


product1 := &Product{}

product1.Add("Title", "first_title")

第二种情况是从product包中公开的公共函数。在这种情况下,Product必须提供a 的实例(或指针)作为参数。


package products


func Add(p *Product, field, value string) {

        // Same switch-case as above

}

Add 函数然后可以从任何其他包中使用。


package main


import (

        "path/to/products"

)


type Product struct {

        // ...

}


func main() {

        product1 := &Product{}

        products.Add(product1, "Title", "first_title")

通常在您的场景中,首选第一种方法,因为它封装了管理其自身属性的功能。


第二种情况可能被视为“类方法方法”(对于那些来自像 Python 或 Java 之类的 OOP 的方法),其中包类似于类,公开的函数类似于类方法,这些方法更通用,可用于多种类型实现相同的接口,如下所示:


package products


// where p is a Product interface

func Add(p Product, field, value string) {

        // Same switch-case as above

}


type Product interface {

        someMethod()

}

从另一个包中:


package main


import (

        "path/to/products"

)


type Car struct {

        Title string

        Brand string

        Model string

}


type Ship struct {

        // ...

}


type Airplane struct {

        // ...

}


// All types implement `Product` and can be used in `products.Add`

func (c *Car) someMethod() {}

func (s *Ship) someMethod() {}

func (a *Airplane) someMethod() {}


func main() {

       plane := &Airplane{}

       products.Add(plane, "Model", "Boeing-747")

}


查看完整回答
反对 回复 2021-12-07
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

这是按照规范预期的:

方法的类型是以接收者为第一个参数的函数的类型。

https://golang.org/ref/spec#Method_declarations

因此,当您在Addon 上声明方法时Product,您会得到一个函数,该函数接受一个指向 a 的指针Product作为其第一个参数。所以你最终得到

func (p *Product) Add()

被翻译成

func Add(p *Product)

所以你的两个电话都是有效的,最终会做同样的事情


查看完整回答
反对 回复 2021-12-07
?
偶然的你

TA贡献1841条经验 获得超3个赞

扩展@Danilo 的精彩回答:


package main


import "fmt"


type T struct {

    i int

}


func (t *T) F() {

    t = &T{1}

    fmt.Println(t.i)

}


func F(t *T) {

    fmt.Println(t.i)

}


func main() {

    t := T{2}

    (&t).F()

    F(&t)

}

方法func (t *T) F()的类型是以func F(t *T)接收者(t *T)为第一个参数的函数的类型。


查看完整回答
反对 回复 2021-12-07
  • 3 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信