Golang *和&的区别

本文深入解析了指针运算符*和取地址符号&在Go语言中的应用,通过实例展示了如何使用它们来操作变量的地址和存储单元,以及如何区分指针变量本身和其指向的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*和&的区别 :
& 是取地址符号 , 即取得某个变量的地址 , 如 ; &a
*是指针运算符 , 可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 , 也就是这个地址所存储的值 .

从代码中验证 :


//先构建一个Person类型 : 
package main 
import "fmt" 
type Person struct{
    name string  
    age int 
}
func (r *Person) hello() string{
    return r.name ; 
}

func main(){
 fmt.Println(&Person{"liu",10})
 var r  = &Person{"liu",10}
 fmt.Println(r)
 fmt.Println(*r)
 fmt.Println(&r)
 var r2 *Person =  &Person{"liu2",10}
 fmt.Println(r2)
}

&是取地址符号, 取到Person类型对象的地址

*可以表示一个变量是指针类型(r是一个指针变量):

3.*也可以表示指针类型变量所指向的存储单元 ,也就是这个地址所指向的值

4.查看这个指针变量的地址 , 基本数据类型直接打印地址

摘自其他博客 :
经常会见到: p . *p , &p 三个符号
p是一个指针变量的名字,表示此指针变量指向的内存地址,如果使用%p来输出的话,它将是一个16进制数。而*p表示此指针指向的内存地址中存放的内容,一般是一个和指针类型一致的变量或者常量。
而我们知道,&是取地址运算符,&p就是取指针p的地址。等会,怎么又来了个地址,它到底和p有什么区别?区别在于,指针p同时也是个变量,既然是变量,编译器肯定要为其分配内存地址,就像程序中定义了一个int型的变量i,编译器要为其分配一块内存空间一样。而&p就表示编译器为变量p分配的内存地址,而因为p是一个指针变量,这种特殊的身份注定了它要指向另外一个内存地址,程序员按照程序的需要让它指向一个内存地址,这个它指向的内存地址就用p表示。而且,p指向的地址中的内容就用*p表示。
 

<think>嗯,用户想了解Golang、JavaC语言之间的主要区别适用场景。首先,我需要回忆这三种语言的特点。C语言是古老的系统级语言,主要用于底层开发,比如操作系统嵌入式系统。Golang是Google推出的,强调简洁高并发,适合网络服务分布式系统。Java是面向对象的企业级语言,跨平台,有强大的生态系统。 接下来,用户可能需要知道它们在设计哲学上的差异。C注重效率硬件控制,手动内存管理。Java有JVM自动管理内存,面向对象,跨平台。Golang编译为本地代码,语法简洁,内置并发支持。 然后要比较性能。C最快,但需要手动优化。Golang性能接近C,但并发模型更好。Java由于JVM可能有启动延迟,但JIT优化后性能不错。引用中提到Golang在特定场景性能更好,但多数情况下与Java差异不大,需要指出这点。 语法方面,C的语法较基础,需要更多代码。Java较冗长,但结构化好。Golang简洁,比如没有类,用结构体方法。 并发模型是关键区别。C需要依赖线程库,Java有线程并发包,Golang有goroutinechannel,更轻量级。 内存管理方面,C手动,JavaGolang自动GC,但GC机制不同,Golang的GC更高效,延迟低。 生态系统部分,Java最丰富,适合企业应用。Golang的生态在云原生方面强,如DockerK8s。C的库底层,适合系统开发。 适用场景需要分情况讨论。C适合底层嵌入式。Java适合大型企业应用安卓。Golang适合高并发云服务。引用中的资料提到Golang适合高性能并发,Java适合企业级应用,需要引用[^1][^3]。 最后,生成相关问题,可能涉及如何选择语言,具体场景下的性能比较,学习曲线等。确保问题覆盖用户可能关心的其他方面,比如内存管理细节或并发实现的例子。</think>### Golang vs Java vs C: 主要区别与适用场景 #### 1. **语言设计哲学** - **C语言**:面向过程,强调底层控制硬件操作,语法简洁但需要手动管理内存。 - **Java**:面向对象,基于JVM实现“一次编写,到处运行”,依赖垃圾回收机制[^2]。 - **Golang**:结合过程式与并发编程,语法极简,内置协程(goroutine)通道(channel)支持高并发。 #### 2. **性能对比** - **C语言**:直接编译为机器码,性能最高,但依赖开发者的优化能力。 - **Golang**:编译为本地代码,性能接近C语言,协程模型在高并发场景下效率显著[^3]。 - **Java**:通过JIT编译优化,长期运行性能接近本地代码,但启动延迟较高[^4]。 #### 3. **语法特性** - **C语言**:需手动管理指针内存,代码灵活性高但易出错,例如: ```c int* arr = (int*)malloc(10 * sizeof(int)); ``` - **Java**:强类型、面向对象,代码结构清晰但较冗长,例如: ```java public class Main { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); } } ``` - **Golang**:语法类似C但更简洁,例如: ```go func main() { slice := make([]int, 0) } ``` #### 4. **并发模型** - **C语言**:依赖第三方库(如pthread)实现多线程,复杂性高。 - **Java**:通过`java.util.concurrent`包提供线程池锁机制。 - **Golang**:原生支持协程(goroutine),通过`go`关键字启动,例如: ```go go func() { fmt.Println("并发执行") }() ``` #### 5. **内存管理** - **C语言**:完全手动管理(`malloc/free`),易引发内存泄漏。 - **Java/Golang**:自动垃圾回收(GC),但Golang的GC延迟更低(通常<1ms)。 #### 6. **生态系统** - **C语言**:适用于操作系统、嵌入式开发,标准库功能有限。 - **Java**:企业级框架丰富(如Spring、Hibernate),安卓开发主流语言。 - **Golang**:云原生领域占优(如Docker、Kubernetes),适合微服务API开发[^3]。 #### 7. **适用场景** - **C语言**:操作系统内核、嵌入式系统、高性能计算。 - **Java**:大型企业应用、安卓应用、金融系统。 - **Golang**:高并发服务(如实时通信)、云平台工具、分布式系统。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值