Go指针详解
摘要: 本文详细介绍了Go语言中的指针及其用法,包括获取变量内存地址、通过指针访问和修改变量值,以及指针变量的特点。同时,解释了make和new的区别:make用于分配引用类型的内存,返回引用本身;new用于分配指针类型的内存,返回存储默认值的新地址。文章通过示例直观展示指针及内存分配的概念,便于初学者理解和掌握(由ChatGPT生成)
获取变量的内存地址(指针)
变量的本质是给数据在内存中的地址起一个好记的别名,指针的作用就是获取一个变量对应的内存地址
package main
import "fmt"
func main() {
p := 10
s := "你好"
// 通过 &变量 来获取变量对应的内存地址
p1 := &p
s1 := &s
fmt.Printf("指针p1值: %v 指针p1类型: %T\n", p1, p1)
fmt.Printf("指针s1值: %v 指针s1类型: %T", s1, s1)
}
/*
指针p1值: 0xc00000a0f8 指针p1类型: *int
指针s1值: 0xc0000240a0 指针s1类型: *string
*/
指针也是有类型的,int类型的数据对应的指针类型是* int,string类型的数据对应的指针类型是* string...
通过指针获取和修改变量的值
package main
import "fmt"
func main() {
p := 10
p1 := &p
// 可以通过 *指针 可以通过指针获取内存对应的值
fmt.Println(*p1)
*p1 = 100
fmt.Println(p)
fmt.Println(*p1)
}
关于指针变量
package main
import "fmt"
func main() {
p := 10
p1 := &p
fmt.Printf("指针变量p1的值: %v 指针变量p1的类型: %T 指针变量p1对应的内存地址: %p", p1, p1, &p1)
}
/*
指针变量p1的值: 0xc00010c098 指针变量p1的类型: *int 指针变量p1对应的内存地址: 0xc000110048
*/
在Go语言中,只要是变量,就有其对应的内存地址,指针变量也不例外,指针变量唯一特殊的地方就是存储的值是其他变量的内存地址。
make 和 new
make用来给引用数据类型来分配内存空间,new用来给指针类型来分配内存空间
package main
import "fmt"
func main() {
var m1 map[int]string
fmt.Println(m1)
// 错误,因为没有给m1分配内存空间,所以无法存储数据
//m1["username"] = "张三"
//fmt.Println(m1)
}
我们只是通过var定义了一个map数据类型的变量,但是由于map属于引用类型,需要提前开辟内存空间,这里没有给m1分配内存,所以导致在存储数据的时候报错。
package main
import "fmt"
func main() {
// 可以通过make来为变量分配内存,引用数据只有分配完内存后才能正常使用
var m1 = make(map[string]string)
fmt.Println(m1)
m1["username"] = "张三"
fmt.Println(m1)
}
new也是同理
package main
import "fmt"
func main() {
var p1 *int
fmt.Println(p1)
// 错误,没有未指针变量p1分配内存空间
// *p1 = 100
p2 := new(int)
fmt.Println(*p2)
*p2 = 100
fmt.Println(*p2)
}
make和new的区别在于:
make用来为引用数据类型分配内存,new用来为指针变量分配内存 make返回的是引用数据本身, new返回的是一个新的内存地址,且该内存地址存储的数据为对应数据类型的默认值