2015-03-22 2 views
-1
func (db *Database) VerifyEmail(emailAddress string) (*data.UserName, error) { 
.... 
} 

Может кто-то, пожалуйста, помогите уточнить 1.what и 2.why с вышеуказанной функцией? Из книги docs и this я могу сказать, что VerifyEmail принимает в качестве параметра адрес электронной почты в качестве параметра и возвращает то, что, по моему мнению, является адресом памяти для имени пользователя.Параметры функции Go

Однако, что делает (db *Database)? Я имею в виду, почему это положить после func и до имени функции? И каковы могут быть некоторые причины передать адрес памяти функции в качестве указателя, а не переменной, представляющей его?

+0

Это приемник метода (http://golang.org/ref/spec#Method_declarations), похожий на другие языки «это», и вы используете указатель, если объект может быть большим или может потребоваться метод для изменения объекта - если вы скопируете вещь, метод может изменить только * свою копию * объекта. – twotwotwo

+0

@twotwotwo можете ли вы вставить это в ответ, чтобы я мог принять его? Спасибо! Делает смысл – Chris

ответ

2

(*db Database) перед именем метода является method receiver, аналогично другим языкам «это», и вы используете указатель, если объект может быть большим или может потребоваться изменить объект - если вы копируете он, метод может только изменить свою копию объекта.

1

В Go вы можете определить методы, используя как метод указателя, так и метод no-pointer receivers. Формат чувствует себя как func (t *Type) и func (t Type) соответственно.

Так в чем же разница между приемниками метода указателей и не указателей?

a) Причины использования указателя-указателя?

  1. Вы действительно хотите изменить приемник (read/write, в отличие от просто «читать»)
  2. структура очень большая и глубокая копия стоит дорого.
  3. Согласованность: если некоторые из методов в структуре имеют указатели-указатели, то остальное тоже должно быть. Это позволяет прогнозировать поведение.
  4. Если приемник представляет собой большую структуру или массив, приемник указателей более эффективен.

Если вам нужны эти характеристики при вызове метода, используйте приемник указателя.

b) Причины использования приемника ценности использования?

  1. Если получатель - это карта, func или chan, не используйте указатель на нее.
  2. Если ресивер является срезом, и метод не выполняет повторного выделения или перераспределения среза, не используйте указатель на него.
+0

Очень полезно, спасибо! – Chris

Смежные вопросы