发布时间:2026-01-03
浏览次数:0
为数众的Java开发者于学习Go之际,头一回瞅见*和&之时,皆会出于本能地产生紧张之感:
“Go 也要像 C 一样玩指针了吗?”
答案是:是指针,但和你想象的不一样。
循着 Java 开发者最为熟知的“引用”起始intellij idea golang plugin,助你彻彻底底弄明白 Go 指针与 Java 引用之间的本质区别,。
一、Java 引用:你“用过”,但从没真正见过
在 Java 中:
User u = new User("Tom");
u = null; // 只能断开引用
Java 的原则:
开发者永远不直接接触内存地址
二、Go 指针:可见、可控、但很克制
在 Go 中:
type User struct {
Name string
}
u := User{Name: "Tom"}
p := &u
fmt.Println(p) // 内存地址
fmt.Println(*p) // 实际值
Go 的态度:
允许你接触指针,但只在“安全范围内”
三、核心差异全部呈现(首先查看结论),四、参数进行传递:Java之中最容易产生误解的要点,Java:始终都是值传递 。
void change(User u) {
u = new User("Jack");
}
不会影响外部对象
但:
void changeName(User u) {
u.name = "Jack";
}
会影响对象内部状态
因为 拷贝的是“引用的值”
Go:值 or 指针,一眼就能看出来
func change(u User) {
u.Name = "Jack"
}
不会影响原值
func change(u *User) {
u.Name = "Jack"
}
会影响原值
Go 的好处:
是否修改原值,写在函数签名里
五、结构体方法intellij idea golang plugin,Java类方法与Go接收者,Java 。
class User {
String name;
void setName(String n) {
this.name = n;
}
}
Go(值接收者)
构造一个具有名为SetName方法的结构体实例,该结构体类型为User,方法接收一个string类型的参数n ,用于设置名称 ,。
u.Name = n
}
不会修改原对象
Go(指针接收者)
定义一个函数,这个函数属于名为User的结构体指针类型,函数名称是SetName,它有一个参数是字符串类型的n,然后它用于设置。
u.Name = n
}
会修改原对象
这是 Go 项目中最常见的写法
六、对于 Java 开发者而言,最关心的那个问题是,Go 这种语言会不会呈现出像 C 语言那样容易出现内存泄漏的状况呢?
不会
Go 指针 ≠ C 指针
那为什么 Go 还要指针?
三个核心原因:
1️⃣ 避免大对象拷贝(性能)
2️⃣ 明确表达“我要修改你”
3️⃣ 实现接口和方法共享状态
七、在何种时候应当运用 Go 指针呢?那些被推荐使用指针的场景是什么,而哪些又是不被推荐的呢?八、用一句话来进行总结(送你一句能够成为爆款的话语)。
Java 用“看不见的引用”保护你,
Go 用“受限的指针”相信你。
如有侵权请联系删除!
Copyright © 2023 江苏优软数字科技有限公司 All Rights Reserved.正版sublime text、Codejock、IntelliJ IDEA、sketch、Mestrenova、DNAstar服务提供商
13262879759
微信二维码