go new()和指针

 基础语法  2022-05-01  admin  769  1038

表达式 new(T)将创建一个 T 类型的匿名变量,初始化一个零值,且返回一个指针*T。

ptr := new(int)   // p, *int 类型, 指向匿名的 int 变量
fmt.Println(*ptr) // 0
fmt.Println(ptr)  // 0xc0000180c8
*ptr = 2          // 设置 int 匿名变量的值为 2
fmt.Println(*ptr) // 2
fmt.Println(ptr)  // 0xc0000180c8

a := 5
fmt.Println("地址:", &a)

new 是一个预定义函数,可被重定义。 用 new 创建变量和普通变量声明语句方式创建变量没有什么区别,所以这个是很少用的。 每次调用 new 函数都是返回一个新的变量的地址,对应的变量叫指针。

p1 := new(int)
p2 := new(int)
fmt.Println("p1地址:", p1, "p2地址:", p2) // p1地址: 0xc000018110 p2地址: 0xc000018118
fmt.Println("p1值:", *p1, "p2值:", *p2) // p1值: 0xc000018110 p2值: 0xc000018118
fmt.Println(p1 == p2)                 // false

此种情况多数 p1 和 p2 两个指针的是不同的。

如果两个类型都是空的,也就是说类型的大小是 0,例如 struct{}和[0]int, 有可能有相同的地址(依赖具体的语言实现)(应该谨慎使用大小为 0 的 类型,因为如果类型的大小为 0 的话,可能导致 Go 语言的自动垃圾回收器有 不同的行为,具体请查看 runtime.SetFinalizer 函数相关文档)


如果文章对您有帮助,点击下方的广告,支持一下作者吧!

转载必须注明出处:

go new()和指针 —— code.cent123.com

相关推荐


esp32 使用mqtt 通讯

esp32 使用mqtt 通讯基于go的mqtt 客户端packagemain import( "fmt" "github.com/gogf/gf/v2/encoding/gjson" "github.com/gogf/gf/v2/frame/g" "gobot.io/x/gobot" &qu

GoFrame 框架中使用 mqtt 协议通讯

GoFrame 框架中使用 mqtt//SPDX-License-Identifier:MIT //SPDX-FileCopyrightText:2022mochi-mqtt,mochi-co //SPDX-FileContributor:mochi-co packagemqtt import( "flag" "gfmqtt/internal/

systemctl 使用

Systemd是Linux系统工具,用来启动守护进程,已成为大多数发行版的标准配置。而systemctl是Systemd的主命令,用于管理系统。其实我们大部分服务都有使用systemctl管理,比如MySQL、Nginx等等。常见配置如下:[Unit] #单元描述 Description=GFAPP #在什么服务启动之后再执行本程序 After=mysql.service [Serv

php redis 分布式锁

Redis 分布式锁是一种使用 Redis 数据库来实现的同步机制,用于在分布式系统中保证多个进程或线程对共享资源的互斥访问。Redis 分布式锁的基本原理是使用 Redis 的 SETNX 命令来尝试设置一个键,如果这个键不存在,那么获取锁成功,否则获取锁失败。获取锁成功后,需要设置锁的过期时间,以防止锁被永久占用。释放锁时,需要删除这个键。Redis 分布式锁有一些优点和缺点:优点:Redis