其实我刚开始学习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)
}
这个程序中的错误是什么?
答案 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)
}
答案 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。
考虑到字符串是只读字节片。并且切片是参考类型,这意味着公共阵列或切片的子切片后面的阵列是相同的。它与问题无关,但在这种情况下应予以考虑。