Есть ли польза от использования методов, а не функций? - PullRequest
1 голос
/ 01 октября 2019

Я разрабатываю структуру "Matrix" и связанные с ней методы для практики Go. Я создал много методов, но понял, что все эти методы можно заменить на функции, которые я использовал для C ++ и C ++. Если я создаю функцию, параметром которой является тип класса, функция не может использовать закрытую переменную класса(скрытие информации) Однако, когда я создал подобный код, используя «Go», функция может получить доступ к переменной структуры. Так что я не понимаю, что отличается между методами и функциями в Go. Есть ли какая-то прибыль, используя методы, а не функции или наоборот?

Первый - мой оригинальный код "Матрица" (не все). В нем использовался метод "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<m; i++{
        a.component[i] = make([]float32, n)
        for j:=0; j<n; j++{
            a.component[i][j]=1
        }
    }
    return a
}
//Tr function; find trace of an Array
func (a Array) Tr() float32{
    var sum float32 = 0
    for i:=0; i<a.row; i++{
        sum += a.component[i][i]
    }
    return sum
}

func main(){
    a := Ones(3,3)
    fmt.Println(a.Tr())
}

Второй - другой похожий код. (Все то же самое, но часть "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<m; i++{
        a.component[i] = make([]float32, n)
        for j:=0; j<n; j++{
            a.component[i][j]=1
        }
    }
    return a
}
//Tr function; find trace of an Array
func Tr(a Array) float32{
    var sum float32 = 0
    for i:=0; i<a.row; i++{
        sum += a.component[i][i]
    }
    return sum
}

func main(){
    a := Ones(3,3)
    fmt.Println(Tr(a))
}

1 Ответ

4 голосов
/ 01 октября 2019

Если вы просто хотите вызвать функцию или метод, это не имеет значения, вы можете создать функцию с сигнатурой, где получатель является обычным, обычным параметром. Не будет никакого снижения производительности (могло бы быть, если бы методы могли быть виртуальными , но в 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() легче понять.

Методы являются обязательными, если вы хотите реализовать интерфейсы. Если интерфейс содержит несколько методов, его могут реализовать только типы, у которых есть эти методы. См. Связанные: Зачем нужны интерфейсы в Golang? Следует также отметить, что вы можете создавать только методы, определенные в одном и том же пакете, поэтому, если вы хотите "вооружить" тип из другого пакета, вы можете'' использовать 'методы.

Одна вещь, которую я бы назвал "выгодой" для использования методов: вы не можете вызывать функции по имени, но вы можете обращаться и вызывать методы по имени. Подробнее см. Вызов функций со специальным префиксом / суффиксом .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...