Типы функций определяются ключевым словом func
, за которым следует необязательный получатель, за которым следует имя функции, список параметров в скобках (который может быть пустым) и список результатов (который может быть пустым), и затем тело функции.
Список результатов (ноль или более типов) - это контракт, который будет возвращать функция. Это может быть список типов или список именованных параметров, включая их типы.
В вашем определении функции для call()
:
func (p *Sample) call() *Sample.Env {
Ваш список результатов не соответствует этому ожиданию. *Sample.Env
- это указатель на свойство Env
типа Sample
, но не сам тип.
Ваша функция возвращает значение &p.Env
. Если вы измените сигнатуру своей функции так, чтобы список результатов был просто типа &p.Env
, тогда ваша программа запустится. p.Env
является строкой, поэтому &p.Env
является указателем на строку. *string
- это тип «указатель на строку». Поэтому, если вы измените свою подпись функции на эту, ваш код будет работать:
func (p *Sample) call() *string {
См:
- Типы функций
- Типы
Почтовый скрипт
Тип возврата call()
- *string
, то есть указатель на строку. Таким образом, чтобы напечатать это, вы просто разыменовываете это к строке со звездочкой:
env := pa.call()
fmt.Printf("Env is %s\n", *env)