大白话!go语言中的指针、指针类型的方法接收器

本文详细介绍了Go语言中指针的使用,包括取地址、值传递与方法接收器的选择,强调了在处理大型对象和需要修改对象内容时应如何决定使用指针或非指针接收者。

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

go语言中的指针使用起来的比较简单。应用如下:

1.普通的对象取地址,获取对象值
  • 符号&,取地址符,可以取变量的地址,或结构体对象的地址等。
  • 符号*,是从地址中取值(根据栈中存储地址,从堆中获取映射的值
var a int
p := &a
v := *p
2.方法中的指针类型的接收器

举个例子先:

func (p *Point) ScaleBy(factor float64) {
    p.X *= factor
    p.Y *= factor
}

注意:go中的只有值传递,传递指针也是传递的指针的具体内容,比如0X5d544d

上面例子中方法的接收者是指针类型,不管是指针类似还是非指针类型的接收者 ,都是可以通过指针/非指针类型进行调用的,编译器会帮你做类型转换。
在声明一个method的receiver该是指针还是非指针类型时,需要考虑两个方面的因素:

(1)这个对象本身是不是特别大,如果声明为非指针变量时,调用会产生一次拷贝;

(2)如果你用指针类型作为receiver,那么你一定要注意,这种指针类型指向的始终是一块内存地址,就算你对其进行了拷贝。

非指针类型每一次的传递是值拷贝,如果对象过大,开销会变大。

那什么时候用指针对象作为接收器,什么时候用非指针对象作为接收器呢?

当涉及到对原对象内容修改对象,使用同一个对象的值的时候,使用指针接收者。对于指针,go会帮我们隐式的解引用。不需要取地址等等。

type Stu struct {
	Name string
	Age int
}

func TestDefer(t *testing.T) {
	s := &Stu{
		Name: "zhangsan",
		Age: 18,
	}	
	// go语言中自动解引用。
	fmt.Println("name:",s.Name)
	fmt.Println("age:",s.Age)
	
}

### C++ 指针概念的大白话解释 #### 什么是指针指针是一个特殊的变量,它的值是另一个变量的地址。换句话说,指针存储的是内存位置而不是具体的数值[^1]。 例如,在C++中声明一个整数类型指针: ```cpp int *ptr; ``` 这里的`*`表示这是一个指向整数类型数据的指针。如果有一个整数变量`num`: ```cpp int num = 10; ``` 那么可以通过取址运算符`&`获取这个变量的地址并赋给指针: ```cpp ptr = # ``` 此时`ptr`保存的就是`num`所在的内存地址。 #### 如何理解指针的作用? 想象一下图书馆里的书架编号系统。假设有一本书放在某个特定的位置上(比如第7排第3层),而你只需要记住这本书所在的具体坐标就能快速找到它。同样地,在计算机程序里,当创建了一个变量之后,操作系统会给其分配一段独一无二的记忆空间;如果我们想操作该变量的内容而不直接提及名称的话,则需要用到能够记录下这段记忆区域起始处的信息——这就是所谓的“指针”。 另外值得注意的一点是在定义多个同种类型指针时,把星号紧挨着类型名可以帮助程序员更好地理解和维护代码逻辑[^2]: ```cpp // 这样写更清晰明了 int* p1, p2; // 只有p1是指向int的指针,p2不是 int *q1,*q2; // q1,q2都是指向int的指针 ``` #### 动态内存管理中的应用 除了作为普通变量地址外,指针还广泛应用于动态内存分配场景之中。例如使用`new`关键字可以在堆区申请一块新的未被使用的连续字节序列来构建对象实例,并返回这块新辟出来的首部位置供后续调用者存入实际的数据结构体成员或者数组元素等等[^3]。 ```cpp MyClass* obj = new MyClass(); delete obj; ``` 以上就是关于C++指针的一些基础介绍以及大白话的理解方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值