在结构定义之外使用方法的原因是什么?

时间:2018-11-20 06:18:54

标签: go methods struct

为什么要在结构的类型定义之外声明方法?例如:

type antenna struct {
    name string
    length float32
    girth float32
    bloodtype string
}

func (p *antenna) extend() {
    p.length += 10
}

在我看来,该方法可能是该结构的一部分? (现在,我们应该忽略结构应该是值类型)

type antenna struct {
    name string
    length float32
    girth float32
    bloodtype string

    func extend() {
        length += 10
    }
}

这将更类似于传统的OOP。除了“结构是值类型而类是引用类型”之外,我没有找到任何很好的解释来说明为什么这样做。我知道区别,但这对我来说不是一个令人满意的答案。无论如何,该方法都必须像这样被调用:

var x = antenna()
x.extend() 

那么分离struct和方法有什么意义呢?像使用典型的OOP语言一样,将它们在代码中直观地分组在一起似乎对我有用吗?

2 个答案:

答案 0 :(得分:0)

我的观点:
1.这种方法更简单,并使结构类型和其他类型(如以下代码)的语言一致 /统一。 2.您不需要使用thisself指针,而可以根据需要命名它,这使得解释p(在您的示例中)更简单。

这也可能是相关的:
In Go is naming the receiver variable 'self' misleading or good practice?

您可以定义自己的类型,请参阅此示例(此命名类型中没有内部结构):

package main

import "fmt"

type num int32

func (p *num) inc() {
    *p++
}

func main() {
    p := num(100)
    p.inc()
    fmt.Println(p) // 101
}

答案 1 :(得分:0)

在golang中,如果我们需要与类型相关联的函数(例如struct),则必须按以下方式对其进行定义(此处为go struct):

type my_type struct {
    // fields ...
}

func (m my_type) fn_name(fn_parameters) fn_return_type {
    // do whatever we want
}

这不是您以自己的方式定义的。但是可以根据需要使用标识符的名称。