GO语言自学_009_指针
C语言和GO语言指针区别
1、结构体成员调用时
C语言:ptr -> name
GO语言:ptr.name
2、垃圾回收机制
C语言:不允许返回栈上的指针,GO语言可以返回栈上的指针,程序在编译的时候就确定了变量的分配位置(编译时,发现有必要,将变量分配到堆上)。
GO语言:在使用指针时,会使用自身内部的垃圾回收机制(GC),开发者不需要主动手动释放内存。
案例代码
package main
import "fmt"
func main() {
/*
方法一
*/
// 定义变量
name1 := "Lily"
// 定义指针
ptr1 := &name1
fmt.Println("变量的值:", *ptr1)
fmt.Println("变量的指针:", ptr1)
/*
方法二,使用new关键字定义
*/
// 定义一个指针
ptr2 := new(string)
// 对指针赋值
*ptr2 = "Duke"
fmt.Println("指针的值:", *ptr2)
fmt.Println("指针的地址:", ptr2)
/*
testPtr测试
*/
// 可以返回栈上的指针,编译器在编译程序时,会自动判断这段代码,将city变量分配在堆上(内存逃逸)。
city1 := testPtr()
fmt.Println("城市名称:", *city1)
fmt.Println("城市指针:", city1)
}
// 定义一个函数,返回string类型的指针(go语言返回类型写在参数后面)
func testPtr() *string {
city := "深圳"
ptr := &city
return ptr
}
案例代码结果
ASUS@DESKTOP-NFP9SLA MINGW64 /c/gowork/src
$ go run 08_pointer.go
变量的值: Lily
变量的指针: 0xc00006e250
指针的值: Duke
指针的地址: 0xc00006e270
城市名称: 深圳
城市指针: 0xc00006e290
判断是否为空指针
C:null, C++:nullptr, GO:nil
// city1是一个指针
if city1 == nil {
fmt.Println("city1为空指针")
} else{
fmt.Println("city1不是空指针")
}