星号在“走”中做了什么

时间:2010-08-24 00:08:28

标签: go

我是一名网络开发人员,希望扩大我的视野,以便在编程方面做得更好。我做了一些Java和一些简单的Android应用程序。我现在正在研究像C和Go这样的低级语言(到目前为止我必须说它有一些漂亮的语法和很棒的想法,尽管我可能没有经验可以发表评论)。

所以是的,我一直在努力去理解Go website上的例子,我在这样的例子中不断遇到一个特殊的星号:

s := "hello"
if s[1] != 'e' {
    os.Exit(1)
}
s = "good bye"
var p *string = &s
*p = "ciao"

另外,我刚刚注意到,“& s”是什么,它是通过引用分配的(我可能在这里使用PHP会话)?

6 个答案:

答案 0 :(得分:81)

附加到类型(*)的

*string表示指向该类型的指针。

附加到赋值(*)中的变量的

*v = ...表示间接赋值。也就是说,更改变量指向的值。

附加到变量或表达式(*)的

*v表示指针取消引用。也就是说,取变量指向的值。

附加到变量或表达式(&)的

&v表示引用。也就是说,创建一个指向变量值或字段的指针。

答案 1 :(得分:41)

我猜这意味着与C

相同

p is a pointer to a string

声明var p *string = &s会将s对象的地址指定给p

下一行*p = "ciao"会更改s

的内容

请参阅Language Design FAQ

中的此链接

有趣的是,没有指针算术

  

为什么没有指针算术?   安全。没有指针算术   可以创建一种语言   永远不会导致非法   成功错误的地址。   编译器和硬件技术有   进入循环点   使用数组索引可以是   作为使用指针的循环高效   算术。另外,缺乏指针   算术可以简化   执行垃圾   收集器。

现在我想开始学习GO!

答案 2 :(得分:22)

转到 lang 地址,指针和类型

s := "hello"      // type string
t := "bye"        // type string
u := 44           // type int
v := [2]int{1, 2} // type array 

所有这些Go变量都有一个地址。即使是“指针”类型的变量也有地址。区别是字符串类型保存字符串值,int类型保存整数值,指针类型保存地址。

& ==评估要解决,或者想“这是我的地址,所以你知道在哪里找我”

// make p type pointer (to string only) and assign value to address of s
var p *string = &s // type *string
// or
q := &s // shorthand, same deal

* ==取消引用指针,或者认为“将操作传递给地址是我的价值”

*p = "ciao"   // change s, not p, the value of p remains the address of s

// j := *s    // error, s is not a pointer type, no address to redirect action to
// p = "ciao" // error, can't change to type string

p = &t        // change p, now points to address of t
//p = &u      // error, can't change to type *int

// make r type pointer (to pointer [to string]) and assign value to address of p
var r **string = &p // shorthand: r := &p

w := (  r == &p) // (  r evaluates to address of p) w = true
w =  ( *r == p ) // ( *r evaluates to value of p [address of t]) w = true
w =  (**r == t ) // (**r evaluates to value of t) w = true

// make n type pointer (to string) and assign value to address of t (deref'd p)
n := &*p
o := *&t // meaningless flip-flop, same as: o := t

// point y to array v
y := &v
z := (*y)[0] // dereference y, get first value of element, assign to z (z == 1)

在此播放:http://play.golang.org/p/u3sPpYLfz7

答案 3 :(得分:4)

我不知道Go,但基于语法,似乎它类似于C - 那是一个指针。它类似于参考,但更低层次,更强大。它包含相关项目的内存地址。 &a获取变量的内存地址,*a取消引用它,获取内存地址的值。

此外,声明中的*表示它是一个指针。

所以是的,就像在PHP中一样,s的值被更改,因为p&s指向同一块内存。

答案 4 :(得分:4)

*字符用于在C和Go中定义指针。而不是实数值,而是变量具有值的位置的地址。 &运算符用于获取对象的地址。

答案 5 :(得分:2)

我是怎么看的。不同的措辞可能有助于某人更好地理解它(你可以复制粘贴代码并检查输出):

package main

import (
    "fmt"
)

func main() {
    // declare a variable of type "int" with the default value "0"
    var y int

    // print the value of y "0"
    fmt.Println(y)

    // print the address of y, something like "0xc42008c0a0"
    fmt.Println(&y)

    // declare a variable of type "int pointer"
    // x may only hold addresses to variables of type "int"
    var x *int

    // y may not simply be assigned to x, like "x = y", because that 
    // would raise an error, since x is of type "int pointer", 
    // but y is of type "int"

    // assign address of y "0xc42008c0a0" as value to x
    x = &y

    // print the value of x "0xc42008c0a0" which is also the address of y
    fmt.Println(x)

    // print the address of x, something like "0xc420030028" 
    // (x and y have different addresses, obviously)
    fmt.Println(&x)

    // x is of type "int pointer" and holds an address to a variable of 
    // type "int" that holds the value "0", something like x -> y -> 0;
    // print the value of y "0" via x (dereference)
    fmt.Println(*x)

    // change the value of y via x
    *x = 1; /* same as */ y = 1

    // print value of y "1"
    fmt.Println(y); /* same as */ fmt.Println(*x)
}