交换功能在golang中不起作用

时间:2017-11-04 08:21:41

标签: go

其实我刚开始学习golang。在开始时,我认为=:=是相同的。但后来我明白这两者之间存在一些差异。

我在golnag中学习了交换功能

import "fmt"

func swap(x, y string) (string, string) {
    return y, x
}

func main() {
    a, b := swap("hello", "world")
    fmt.Println(a, b)
}

但是当我使用var重写此功能时,这不起作用

package main

import "fmt"

func swap(x, y string) (string, string) {
    return y, x
}

func main() {
   var a, b string
    a ="hello"
    b="world"
     swap(a, b)
    fmt.Println(a, b)
}

这个程序中的错误是什么?

4 个答案:

答案 0 :(得分:4)

另一个解决方案是使用指针:

package main

import "fmt"

func swap(x, y *string) {
    *x, *y = *y, *x
}

func main() {
    var a, b string
    a ="hello"
    b="world"
    swap(&a, &b)
    fmt.Println(a, b)
}

https://play.golang.org/p/-vxUMlaVmN

答案 1 :(得分:3)

要回答您的初始问题,您应该将swap返回的值分配给a和b,如此

a, b = swap(b, a)

请注意,这是一个简单的赋值,没有:附加到相等的

也可以尝试原地重新分配,而不是swap功能: a, b = b, a

答案 2 :(得分:3)

原因是在第二种情况下忽略从swap返回的值。没有任何改变。

尝试:https://play.golang.org/p/uADEf5X15g

package main

import "fmt"

func swap(x, y string) (string, string) {
    return y, x
}

func main() {
    var a, b string
    a = "hello"
    b = "world"
    a, b = swap(a, b)  ////   <----
    fmt.Println(a, b)
}

答案 3 :(得分:2)

变量声明

  • var a string - 声明具有空值的变量
  • a := "spam" - 声明具有特定值的变量
  • func f(a, b string) (string, string) { - 使用值参数声明函数。这意味着每次调用函数时都会将带有传递值的新变量作为参数。
  • func f(a, b *string) (*string, *string) { - 使用指针参数声明函数。在它的转向中,这意味着每次调用函数时都有指向传递变量的指针。

也...

  • a := *string - 声明指针变量。
  • *a - 指针变量的值。
  • &a - 值的指针

就地交换

要在原地交换(不返回和重新分配),你应该在指针之间交换值。

func swap(a, b *string) {
    *a, *b = *b, *a
}

P.S。

考虑到字符串是只读字节片。并且切片是参考类型,这意味着公共阵列或切片的子切片后面的阵列是相同的。它与问题无关,但在这种情况下应予以考虑。