В чем причина наличия методов вне определения структуры? - PullRequest
0 голосов
/ 20 ноября 2018

Почему у нас есть методы, объявленные вне определения типа структуры?Например:

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
    }
}

Это будет больше похоже на традиционную ООП.Я не нашел хороших объяснений того, почему это делается так, как это, кроме того, что "структуры являются типами значений, а классы являются ссылочными типами".Я знаю разницу, но это не удовлетворительный ответ для меня.В любом случае метод должен вызываться так:

var x = antenna()
x.extend() 

Так какой смысл разделять структуру и методы?Их визуальное группирование в коде - как в типичных языках ООП - мне кажется полезным?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

В golang, если нам нужна функция, связанная с типом (скажем, struct), то она должна быть определена, как показано ниже (здесь для go struct):

type my_type struct {
    // fields ...
}

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

Это нечто-то, что вы определяете по-своему.Но имена идентификаторов можно использовать по своему усмотрению.

0 голосов
/ 20 ноября 2018

Мои точки зрения:
1. Это проще таким образом и делает язык непротиворечивым / унифицированным для типов структур и других типов, таких как следующий код.
2. Вывам не нужен указатель this или self, и вы называете его по своему желанию, и это еще проще объяснить, что такое p (в вашем примере).

Также может быть это уместно:
В Go вводящее в заблуждение именование переменной получателя «self» или хорошая практика?

Вы можете определить свои собственные типы,Посмотрите этот пример (здесь нет внутри или struct для этого именованного типа ):

package main

import "fmt"

type num int32

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

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