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不是空指针")
}
posted @ 2022-09-06 11:12  顺心无忧  阅读(39)  评论(0编辑  收藏  举报