【学习笔记】Go指针详解

123 阅读3分钟

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返回的是一个新的内存地址,且该内存地址存储的数据为对应数据类型的默认值