Как правильно использовать указатели в Golang - PullRequest
1 голос
/ 24 апреля 2020

Я новичок в языке go и нахожусь в сценарии, где моя программа работает, но не уверен, должен ли я использовать указатели или нет.

Вот моя программа:

package main

import (
    "fmt"
    "math"
)

type Shape interface {
    getVolume() float64
}

type Cube struct {
    Side float64
}

type RectanglePrism struct {
    Length float64
    Width  float64
    Height float64
}


func main() {
    c := Cube{Side: 3}
    r := RectanglePrism{Length: 4, Width: 3, Height: 3}
    fmt.Println(Volume(c))
    fmt.Println(Volume(r))

}

func (c Cube) getVolume() float64 {
    return math.Pow(c.Side, 3)
}

func Volume(s Shape) float64 {
    return s.getVolume()
}

func (r RectanglePrism) getVolume() float64 {
    return r.Length * r.Width * r.Height
}

Детская площадка: https://play.golang.org/p/LKSvJXNCEbQ

Как видите, Volume не изменяет значения в c, просто выполняет вычисления и, следовательно, необязательно указывает на исходное значение - тем не менее он делает копию, которая стоит дороже

Мои вопросы:

  • getVolume() должен получить указатель на Cube и RectangularPrism?
  • Есть ли лучший способ сделать это?

Цель состоит в том, чтобы исправить эффективный код.

Заранее спасибо

1 Ответ

0 голосов
/ 24 апреля 2020

Как определено в этом https://golang.org/doc/faq#methods_on_values_or_pointers

, если вы изменяете данные в структуре или обрабатываете огромные объемы данных или если ваша структура очень велика, лучше использовать указатель.

Как и в приведенных выше случаях, если вы передаете его по значению, это имеет значение, так как при каждом вызове функции вы передаете новую копию структуры, которая может повлиять на эффективность вашего приложения.

для очень маленьких данных передача их по значению или указателю не будет иметь значения, поскольку разница будет незначительной (как в вашем примере это не будет иметь значения) https://play.golang.org/p/t3_Xzhq88g-

если вы выбираете способ вызова функции, все остальные функции также должны быть вызваны аналогичным образом.

поэтому проанализируйте ваш вариант использования (это несколько наводящих на размышления сценариев использования, возможно, будет больше сценария ios)

1) вы собираетесь изменить данные в структуре

2 ) данные будут огромными

3) или если структура будет огромной

4) вы будете возвращать измененные значения (как в вашем примере)

и на основе этих данных вы можете использовать указатель или передаваемое значение

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