Как вернуть переменную структуры в метод - PullRequest
0 голосов
/ 25 июня 2018

Эта программа не компилируется. Это показывает, что метод Env недоступен в структуре sample для метода call. Я могу получить доступ к переменной Env непосредственно в основной программе, но мне любопытно узнать, почему она не компилируется.

package main

//Sample is a struct
type Sample struct {
    Env string
}

func main() {
    pa := &Sample{Env: "acd"}
    pa.call()
}

func (p *Sample) call() *Sample.Env {
    return &p.Env
}

1 Ответ

0 голосов
/ 25 июня 2018

Типы функций определяются ключевым словом 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 {

См:

  1. Типы функций
  2. Типы

Почтовый скрипт

Тип возврата call() - *string, то есть указатель на строку. Таким образом, чтобы напечатать это, вы просто разыменовываете это к строке со звездочкой:

env := pa.call()
fmt.Printf("Env is %s\n", *env)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...