【Go语言】指针总结
34指针
package main
import "fmt"
func main() {
var v int = 10
fmt.Println(v)
fmt.Println(&v)
var p *int = &v
fmt.Println(p)
fmt.Println(*p)
}
10
0xc0000160c8
0xc0000160c8
10
36 构造
package main
import "fmt"
type Vertex struct {
X, Y int
S string
}
func main() {
v := Vertex{X: 1, Y: 2, S: "ver"}
fmt.Println(v)
v4 := Vertex{}
fmt.Printf("%T %v\n", v, v4)
var v5 Vertex
fmt.Printf("%T %v\n", v5, v5)
// ポインタ
v6 := new(Vertex)
fmt.Printf("%T %v\n", v6, v6)
// 推奨
v7 := &Vertex{}
fmt.Printf("%T %v\n", v7, v7)
// スライス
// 推奨
s1 := make([]int, 0)
fmt.Println(s1)
s2 := []int{}
fmt.Println(s2)
}
请注意,v4、v5版本的限制方法与v6、v7版本的不同,因此要区分开来。
在声明指针时,推荐使用v7的方法(通过添加“&”符号来明确定义指针)。
同样,切片也有多种定义方式,但s1被推荐使用。
※由于这门课程是一些时间以前的信息,可能已经变化。
package main
import "fmt"
type Vertex struct {
X, Y int
S string
}
func changeVertex(v Vertex) {
v.X = 1000
}
func changeVertex2(v *Vertex) {
v.X = 1000
}
func main() {
v := Vertex{X: 1, Y: 2, S: "ver"}
changeVertex(v)
fmt.Println(v)
v2 := &Vertex{X: 1, Y: 2, S: "ver"}
changeVertex2(v2)
fmt.Println(v2)
}
{1 2 ver}
{1000 2 ver}
当需要改变结构体的值时。
在`changeVertex()`函数中,变量只在函数内部被修改,对`main`函数没有影响。
如果想要进行修改,可以在声明结构体时给`v2`加上一个&符号。
传递给`changeVertex2()`时,传递的是存储结构体的内存地址。
通过在函数参数前加上一个星号`*`,可以从传递过来的内存地址引用内容,从而可以修改值。