您可以将多个值中的某些或全部作为函数的指针返回吗?

时间:2018-11-18 06:29:44

标签: pointers go

使用Go,在尝试返回字符串作为指针,同时还返回另一个值时,我遇到各种错误。这样的事情(请谅解,因为这不是正在运行的代码,我写了它只是为了让我感觉要做什么,因为我不知道如何使其完全正常工作):

func A (s string) *string, int {

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

当我尝试各种组合来说时,将字符串(变量a)作为指针返回时会遇到各种错误。这很容易,并且有许多示例返回了单个变量,但是我不确定是否可以使用多个返回值。

很抱歉,如果这似乎是一个非常基本的问题,我仍然在围着Go前进。

3 个答案:

答案 0 :(得分:2)

如golang规范中的here所述,您在this部分中错了,所以:

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

是可编译的代码

答案 1 :(得分:0)

您可以从一个函数返回多个变量:

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

答案 2 :(得分:0)

@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)
}