Для программистов непривычных к указателям, различие между эти два примера могут сбивать с толку, но ситуация на самом деле очень просто. При определении метода для типа приемник (s в примерах ) ведет себя точно так же, как если бы это был аргумент метода . Независимо от того, определять ли получатель в качестве значения или как указатель тот же вопрос, то как должен быть аргумент функции значением или указателем. Существует несколько соображений.
Во-первых, и, самое главное, нужен ли метод для изменения приемника ? Если это так, приемник должен быть указателем. (Ломтики и карты действуют как ссылки, поэтому их рассказ немного более тонкий, но для экземпляр, чтобы изменить длину фрагмента в методе, получатель должен по-прежнему быть указателем.) В приведенных выше примерах, если pointerMethod изменяет поля s, вызывающий будет видеть эти изменения, но valueMethod - , вызываемый с копией аргумента вызывающего абонента (это определение , передающее значение), поэтому изменения, которые он делает, будут невидимы для вызывающего.
Кстати, приемники-указатели идентичны ситуации в Java, , хотя в Java указатели скрыты под обложками; это Go's Ценностные приемники, которые являются необычными.
Во-вторых, рассмотрение эффективности. Если приемник большой, например, большой структуры, будет гораздо дешевле использовать указатель .
Следующая последовательность. Если некоторые из методов этого типа должны иметь указатели-указатели, то остальное тоже должно быть, поэтому набор методов равен , независимо от того, как используется этот тип. Подробные сведения см. В разделе наборы меток .
Для таких типов, как основные типов, ломтики и малые структуры, значение приемника очень дешево, поэтому, если семантика методы требует указателя, значение приемник является эффективным и ясно.
Возможный дубликат [Что отличает функции и методы от Go?] (Http://stackoverflow.com/questions/8263546/whats-the-difference-of-functions-and-methods-in-go) – rkmax
[«Указатели против значений в параметрах и возвращаемых значениях»] (http://stackoverflow.com/questions/23542989/pointers-vs-values-in-parameters-and-return-values/23551970#23551970) рассказывает о некоторые связанные с этим вопросы. – twotwotwo