在golang,和&之间的区别是什么?和*

时间:2015-10-20 17:17:35

标签: go

有人可以解释&和和*在GO lang ..并提供何时和&和*将用于说明差异? 从我所读到的,它们都涉及访问变量存储位置,但我不知道何时使用&或*。

6 个答案:

答案 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生成xx类型的指针。 [...]

     

对于指针类型*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
}