我是一名网络开发人员,希望扩大我的视野,以便在编程方面做得更好。我做了一些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会话)?
答案 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
有趣的是,没有指针算术
为什么没有指针算术? 安全。没有指针算术 可以创建一种语言 永远不会导致非法 成功错误的地址。 编译器和硬件技术有 进入循环点 使用数组索引可以是 作为使用指针的循环高效 算术。另外,缺乏指针 算术可以简化 执行垃圾 收集器。
现在我想开始学习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)
答案 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)
}