golang 指针
- 一个指针变量指向了一个值的内存地址,类似于变量和常量,在使用指针前你需要声明指针。
- 每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。使用&字符放在变量前面对变量进行“取地址”操作。 Go语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型,如:*int、*int64、*string 等。
& 取内存地址
* 根据内存地址取值
package main
import "fmt"
func main() {
var n1 int = 10
fmt.Println("n1的内存地址为:", &n1) //获取n1的内存地址值为:0xc00001c0b8
var n2 *int = &n1 //n2为整型类指针,将n1的内存地址赋值给n2
fmt.Println("n2的值为:", n2) //输出的为n1的内存地址
fmt.Println("n2地址指向的值为:", *n2) //输出的为n1的内存地址指向的值,为10
}
输出结果
n1的内存地址为: 0xc00001c0b8
n2的值为: 0xc00001c0b8
n2地址指向的值为: 10
1. 可以通过指针改变指向值
package main
import "fmt"
func main() {
var s1 string = "a"
fmt.Println("s1的值为:", s1)
var p1 *string = &s1 //定义p1的类型为字符串类型指针,将s1的内存地址赋值给p1
*p1 = "b" //将p1内存地址指向的值重新赋值为b
fmt.Println("s1的值为:", s1) //由于s1的内存地址没变,内存地址指向的值重新赋值了,所以重新输出s1的值为b
}
输出结果
s1的值为: a
s1的值为: b
2.指针变量接收的一定是地址值
package main
import "fmt"
func main() {
var n2 int = 100
var p2 *int = n2
fmt.Println("p2的值为:", p2)
}
输出结果
cannot use n2 (variable of type int) as *int value in variable declaration
3.指针变量的类型不可以和内存地址不匹配
package main
import "fmt"
func main() {
var f1 float32 = 0.123
var p3 *float64 = &f1 //定义p3的类型为float64类型指针,将f1的内存地址赋值给p3,由于f1为float32类型,跟*float64类型不匹配
fmt.Println(p3)
}
输出结果
cannot use &f1 (value of type *float32) as *float64 value in variable declaration