有人可以解释&和和*在GO lang ..并提供何时和&和*将用于说明差异? 从我所读到的,它们都涉及访问变量存储位置,但我不知道何时使用&或*。
答案 0 :(得分:12)
这是一个非常简单的示例,说明了如何使用&
和*
。注意*
可用于两个不同的事情1)将变量声明为指针2)以取消引用指针。
package main
import "fmt"
func main() {
b := 6
var b_ptr *int // *int is used delcare variable
// b_ptr to be a pointer to an int
b_ptr = &b // b_ptr is assigned value that is the address
// of where variable b is stored
// Shorhand for the above two lines is:
// b_ptr := &b
fmt.Printf("address of b_ptr: %p\n", b_ptr)
// We can use *b_ptr get the value that is stored
// at address b_ptr, or dereference the pointer
fmt.Printf("value stored at b_ptr: %d\n", *b_ptr)
}
结果:
address of b_ptr: 0xc82007c1f0
value stored at b_ptr: 6
答案 1 :(得分:5)
他们正好相反。如the "Address operators" section of the spec中所述:
对于
T
类型的操作数&x
,地址操作*T
生成x
到x
类型的指针。 [...]对于指针类型
*T
的操作数*x
,指针间接T
表示x
指向的类型x
的变量。如果nil
为*x
,则尝试评估&
会导致运行时出现紧急情况。
换句话说:*
接受一个变量(或其他可寻址实体)并返回指向它的指针,而nil
接受一个指针并返回它指向的东西(除非它& #39; s @Html.EditorFor(model => model.IsPayed,
new { htmlAttributes =
new { data_toggle = "toggle", data_on = "Payed", data_off = "Not payed", data_onstyle = "success", data_offstyle = "danger", type = "checkbox" } })
,意味着它没有任何意义。
答案 2 :(得分:3)
&
是运营商的地址。在某些情况下,*
代表指针,而在其他情况下,p := &SometType{}
代表'取消引用运算符'。
所以基本上,如果你做SomeType{}
运算符的地址用于返回用复合文字语句p
创建的对象的地址,如果我要删除它,我将不再拥有引用,而是直接将值赋给p
。在这种情况下,*SomeType
将是*
,因为这是我所采用的地址类型。如果我在其前面声明了一个p
的类型,我将其指定为指向该类型的指针。
现在最后剩下的用法是作为deference运算符,在我的经验中你不会在Go中使用这么多,但它在C和C ++中是非常常见的。这用于返回实际值,而不是最常用于分配。因为,如果我有*SomeType
并且它是SomeType
并且在本地我想要分配给someType := *p
的实例,那么我将需要以下语句public static void main(String[] args) throws Exception { ... }
该值已分配给我的值类型。
希望解释有所帮助。它不是最技术性的,而是我的目标是提供对常见用途的理解。
答案 3 :(得分:3)
&
从变量中生成一个指针。
*
“获取”存储指针指向的值。
对于类型,var *type
表示“* var属于类型”(并且没有变量,它只是表示“指向某些类型的指针”
答案 4 :(得分:2)
这有助于我更好地理解,您可以在游乐场中运行代码并稍微玩一下,看看它的行为如何链接在这里:https://play.golang.org/p/c7jxLJkdRDd(如果以后链接是deactivet,只需复制下面的粘贴代码)< / p>
package main
import (
"fmt"
)
func main() {
var a = 5
var p = &a // copy by reference
var x = a // copy by value
fmt.Println("a = ", a) // a = 5
fmt.Println("p = ", p) // p = 0x10414020
fmt.Println("*p = ", *p) // *p = 5
fmt.Println("&p = ", &p) // &p = 0x1040c128
fmt.Println("x = ", x) // x = 5
fmt.Println("\n Change *p = 3")
*p = 3
fmt.Println("a = ", a) // a = 3
fmt.Println("p = ", p) // p = 0x10414020
fmt.Println("*p = ", *p) // *p = 3
fmt.Println("&p = ", &p) // &p = 0x1040c128
fmt.Println("x = ", x) // x = 5
fmt.Println("\n Change a = 888")
a = 888
fmt.Println("a = ", a) // a = 888
fmt.Println("p = ", p) // p = 0x10414020
fmt.Println("*p = ", *p) // *p = 888
fmt.Println("&p = ", &p) // &p = 0x1040c128
fmt.Println("x = ", x) // x = 5
fmt.Println("\n Change x = 1")
x = 1
fmt.Println("a = ", a) // a = 888
fmt.Println("p = ", p) // p = 0x10414020
fmt.Println("*p = ", *p) // *p = 888
fmt.Println("&p = ", &p) // &p = 0x1040c128
fmt.Println("x = ", x) // x = 1
&p = 3 // error: Cannot assign to &p because this is the address of variable a
}
答案 5 :(得分:-4)
&安培;和*主要用于函数:
package main
import (
"fmt"
)
type Person struct {
name string
ageYears int
areDays int
}
func main() {
john := Person{name: "John", ageYears: 46}
toDays(&john)
fmt.Println(john) //{John 46 16790}
toDays2(john)
fmt.Println(john) //{John 46 16790}
}
func toDays(p *Person) {
p.areDays = p.ageYears * 365
}
func toDays2(p Person) {
p.areDays = -1
}