Можете ли вы вернуть некоторые или все несколько значений в виде указателей на функцию? - PullRequest
0 голосов
/ 18 ноября 2018

Работа с Go Я получал различные ошибки, пытаясь вернуть строку в качестве указателя при возврате другого значения.Примерно так (пожалуйста, извините за то, что этот код не выполняется, я просто написал его, чтобы дать представление о том, что я хочу сделать, поскольку я не знаю, как именно заставить его работать):

func A (s string) *string, int {

  // Stuff
  return &a, b
}
*c, d := A("Hi there.")

Когда я пытаюсь сказать разные комбинации, возвращаю строку (var. a) в качестве указателя, я получаю различные ошибки.Это легко, и есть десятки примеров с одной возвращаемой переменной, но я не уверен, возможно ли это с несколькими возвращаемыми значениями.

Извините, если это кажется очень простым вопросом, я все еще сосредоточен вокругGo.

Ответы [ 3 ]

0 голосов
/ 18 ноября 2018

Вы можете вернуть несколько переменных из функции:

func A (s string) (string, int) {
  a := "hello world"
  b := 99

  return a, b
}

c, d := A("Hi there.")

Я хотел бы отметить одну вещь: в Go строки не являются указателями. В таких языках, как C, вы привыкли думать о string как о char*, однако в Go, string рассматривается как примитив так же, как вы бы int.

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

Если вы окажетесь в ситуации, когда вы хотите вернуть строку nil (что вы не можете сделать, потому что это не указатель), тогда вы вернете пустую строку ("").

Указатели : Если вы действительно хотите использовать указатели ...

func A (s string) (*string, int) {
  a := "hello world"
  b := 99

  // NOTE: you have to have a variable hold the string.
  // return a, &"hello world" // <- Invalid
  return a, &b
}

// 'd' is of type *string
c, d := A("Hi there.")

var sPtr *string = d
var s string = *d // Use the * to dereference the pointer
0 голосов
/ 20 ноября 2018

@ poy: Я взял твой код и положил на игровую площадку, и мне удалось заставить его работать. Я не уверен, в чем проблема, почему это не сработало для меня, но, вероятно, что-то еще происходило. Во всяком случае, с небольшим массажем это сработало:

package main

import (
    "fmt"
)

func A (s *string) (*string, int) {
  b := 99

  return s, b
}

func main() {
    r := "Hi there."
    var s *string = &r

    c, d := A(s)
    fmt.Println(*c, d)
}
0 голосов
/ 18 ноября 2018

как сказано здесь в спецификации Голанга, вы ошибаетесь в этой части так:

func A (s string) (*string, int) {
    //stuff
}

- это скомпилированный код

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