什么情况下使用指针?
对于Golang开发者来说,何时使用指针,何时使用值是一个头疼的问题,这个问题似乎没有绝对的答案。但事实并非如此,本文将总结何时使用指针更加合理。

在开始阅读前,建议读者能够清晰理解Golang指针、类型和值等概念。此外,本文并不是绝对答案,而是基于使用经验和社区讨论总结的实践。
在哪些情况下使用指针更加合理?
1. 结构体定义的字段
对于使用type,SliceHeader struct { Data uintptr Len int Cap int }结构体定义的字段,方法中接受者函数传参函数和方法返回值,一般都使用指针作为接受者。官方文档建议,如果犹豫,请使用指针。对于其他类型内部通过指针实现的类型,定义一个指针指向这些类型的变量是多余的。当一个结构体很复杂或者需要修改结构体时,使用指针更合适,其他情况则可以使用值。如果滥用指针,则会出现一些不可预料的情况。
2. 方法的接受者
方法通常使用指针作为接受者。这是因为值传递可能会导致结构体内存占用过高的问题,使用指针可以减少栈内存的占用。但是,使用指针也有可能会降低性能,因为堆内存的分配会导致GC频繁地执行。如果值拷贝对性能有损害,则指针更加合适。
3. 需要进行场景修改的结构体
对于需要修改的结构体,使用指针更加合适。在64位系统中,一个切片变量仅占用24个字节。对于切片、map和channel类型,通常也不需要使用指针。
4. 包含sync.Mutex字段的结构体
如果结构体中包含sync.Mutex等同步字段,则无论其方法的接受者和参数和返回值均应使用指针。这是因为这类字段类型是禁止拷贝的。
5. 序列化的结构体
对于用于序列化的结构体,根据序列化协议和库可能有所区别,指针类型定义可以更方便地处理,如Golang默认的Json序列化协议对于是否显示字段定义为指针可以解决。
什么情况下必须使用指针?
对于以下场景,使用指针是必须的:
1. 包含sync.Mutex字段的结构体
如果结构体中包含sync.Mutex等同步字段,则无论其方法的接受者和参数和返回值均应使用指针。这是因为这类字段类型是禁止拷贝的。
2. 需要进行场景修改的结构体
在结构中定义结构体时,如果需要考虑是否内存占用或结构体的用途,可以将结构体分为工具结构体和资源结构体。资源结构体一般用于模块或分层之间的通信,如VO、DAO、Entity等。对于这类结构体,使用指针可以提升性能。对于工具结构体,则需要更加考虑内存占用。
总结
本篇博文详细总结了在何时使用指针更加合理,并阐述了值传递和指针传递性能和语义权衡的问题。掌握Golang中类型、值、指针类型等基础概念才能优雅地使用指针。如果遇到疑惑,可以参考标准库和借鉴其他成熟项目的实践。
原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/7421.html
