首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Go:从指针到非指针,方法实现的优雅转型

在Go语言编程中,选择方法接收者类型是一个至关重要的决策,直接影响代码的安全性和性能。本文将深入探讨将一个指针方法改为非指针方法的优劣,并通过具体示例分析其影响。...方法实现的初始状态 以下是一个以指针类型 *SerialId 实现的 ToString 方法: go func (id *SerialId) ToString() string { if id ==...当不需要修改接收者状态时: 非指针方法更适合纯粹的读取操作,确保方法只读不写。...确保值类型的稳定性: 如果方法主要处理小型数据结构或基础类型,非指针方法避免了不必要的指针解引用和内存分配。...总结 将方法从指针类型转换为非指针类型,不仅简化了代码逻辑,还提高了代码的安全性和可读性。在实际开发中,选择何种接收者类型应结合具体的业务需求和数据结构特点,确保代码的健壮性和可维护性。

13510
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    初识指针(指针和指针变量、如何理解地址、指针类型的意义、void*指针、野指针、空指针)(笔记)

    四、指针类型的意义(为什么不用ptr_t p代表所有指针) 1.指针解引用的时候有多大权限 (如果一个指针代替所有的话,解引用时的字节与变量定义类型不同) 2.指针类型决定了指针向前或向后走一步有多大...:无具体指针(泛型指针) 这种类型的指针可以用来接受任意类型的地址,但也有局限性, void*类型的指针,局限性在于他不能直接进行指针的+-整数和解引用的运算 有什么用: 一般void*类型的指针是使用在函数参数的部分...,用来接收不同数据类型的地址, 这样可以实现泛型编程的效果,使得一个函数来处理多种类型的数据 注意: void*类型的指针不能直接进行解引用的操作 void* 类型的指针也不能进行指针计算的操作...//pv++;//err void* 类型的指针也不能加减一的操作 return 0; } 六、野指针: 指针指向的位置是不可知的(随机的,不正确的,没有明确限制的) 使用完指针后未将其置为NULL...七、空指针 空指针是一个特殊的数据类型,它的值定义为NULL。空指针不同于NULL的整数表示,它是一个指针变量的特殊值,表示该指针变量不指向任何有效的内存地址。

    20110

    c语言从入门到实战——数组指针与函数指针

    数组指针与函数指针 前言 数组指针和函数指针都是指针类型,但是它们指向不同的数据类型。 数组指针:数组指针指向的是数组类型。 函数指针:函数指针指向的是函数类型。...C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。...根据上面的例子,第一行的一维数组的类型就是 int [5] ,所以第一行的地址的类型就是数组指针类型 int(*)[5] 。...pf3指向函数的返回类型 int (*) (int x, int y) //pf3函数指针变量的类型 4.2 函数指针变量的使用 通过函数指针调用指针指向的函数。...printf("ret = %d\n", ret); break; case 0: printf("退出程序\n"); break; default: printf("选择错误

    14810

    c语言从入门到实战——基于指针的数组与指针数组

    基于指针的数组与指针数组 前言 指针的数组是指数组中的元素都是指针类型,它们指向某种数据类型的变量。...基于指针的数组是一个数组,其元素是指针,每个指针可以指向不同地址的数据。这种结构常用于存储指向不同对象的指针,例如字符串或动态分配的内存块。 指针数组则是一个指针,它指向一个数组。...但是&arr和&arr+1相差40个字节,这就是因为&arr是数组的地址,+1操作是跳过整个数组的。 到这里大家应该搞清楚数组名的意义了吧。 数组名是数组首元素的地址,但是有2个例外。 2....指针数组 指针数组是指针还是数组 我们类比一下,整型数组,是存放整型的数组,字符数组是存放字符的数组。 那指针数组呢?是存放指针的数组。 指针数组的每个元素都是用来存放地址(指针)的。...arr3[] = {3,4,5,6,7}; //数组名是数组首元素的地址,类型是int*的,就可以存放在parr数组中 int* parr[3] = {arr1, arr2, arr3}; int

    27310

    《Golang从入门到跑路》之指针

    Go语言中的指针操作有以下两种: &:取地址 *:根据地址取值 指针地址和指针类型 指针地址是变量在内存中的位置,在Go语言中用&变量 取变量的地址。...其基本语法如下: ptr := &v // v的类型为T 其中: v:代表被取地址的变量,类型为T ptr:用于接收地址的变量,ptr的类型就为*T,称做T的指针类型。*代表指针。...new函数不太常用,使用new函数得到的是一个类型的指针,并且该指针对应的值为该类型的零值。...区别于new,它只用于slice、map以及chan的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。...make只用于slice、map以及channel的初始化,返回的还是这三个引用类型本身; 而new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。 完

    33220

    C++从入门到精通——this指针

    只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。 二、this指针的特性 this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。...然后在主函数 main 中,定义了一个 A 类型的指针 p,并将其初始化为 nullptr。接下来,通过 p 指针调用 Print() 函数。...然后在主函数 main 中,定义了一个 A 类型的指针 p,并将其初始化为 nullptr。接下来,通过 p 指针调用 Print() 函数。...例如,缺少括号、缺少分号、错误的变量命名等。 类型错误:如果代码中使用了错误的类型或进行了不兼容的类型转换,编译器将报错。例如,将字符串赋值给整数类型的变量、使用未声明的变量等。...,即数据和操作数据的方式是分离开的,而且实现上相当复杂一点,涉及到大量指针操作,稍不注意可能就会出错。

    1.7K10

    Go错误集锦 | 方法接收者的值类型和指针类型

    如图所示: 02 方法接收者是指针类型 如果接收者的类型是指针,那么,我们传递给方法的是原对象的地址,依然是值拷贝,这里的值是地址值,而非是原对象的拷贝。...接收者必须是指针类型的场景: 如果方法需要对接收者进行改变时,则必须是指针类型。这条规则同样适用于切片类型。...例如sync包中的类型字段是不能被拷贝的。 接收者建议使用指针类型的场景: 如果接收者是一个很大的对象时,建议优先使用指针类型。使用指针类型能够进行快速拷贝,可以提高调用方法的效率。...当接收者是map、function或channel类型时。否则,会导致编译错误。 接收者建议使用值类型的场景: 当接收者是一个不被改变的切片类型时。 当接收者的类型是一个基础的类型时。...在该示例中,customer结构体中包含了一个指针类型的字段。

    83910

    c语言从入门到实战——初识指针

    比如: #include int main() { int a = 10; int* pa = &a; //取出a的地址并存储到指针变量pa中 return 0; } 指针变量也是一种变量...2.3 指针变量的大小 前面的内容我们了解到,32位机器假设有32根地址总线,每根地址线出来的电信号转换成数字信号后是1或者0,那我们把32根地址线产生的2进制序列当做一个地址,那么一个地址就是32个bit...3.3 void*指针 在指针类型中有一种特殊的类型是 void* 类型的,可以理解为无具体类型的指针(或者叫泛型指针),这种类型的指针可以用来接受任意类型地址。...编译器给出了一个警告(如下图),是因为类型不兼容。而使用void*类型就不会有这样的问题。...如果该表达式为假(返回值为零), assert() 就会报错,在标准错误流 stderr 中写入一条错误信息,显示没有通过的表达式,以及包含这个表达式的文件名和行号。

    12410

    【C++】函数重载 ④ ( 函数指针定义的三种方式 | 直接定义函数指针 | 通过 函数类型 定义 函数指针 | 通过 函数指针类型 定义 函数指针 )

    的 返回值 不是 " 函数重载 " 的 判断标准 ; 二义性 : 如果 函数重载 与 默认参数 结合使用 , 出现了二义性 , 编译直接失败 ; 函数指针赋值重载函数 : 根据 函数指针 类型中的 参数列表类型...); return_type : 函数指针 指向的函数 的 返回值类型 ; func_ptr : 函数指针 名称 , 使用该 名称 也可以调用函数 , 用法与函数名相同 ; parameter_list..., 定义函数指针 , 直接根据指针的定义语法 指针类型* 指针名称 定义函数指针 , 同时将 add 函数 的 地址 赋值给 函数指针 ; // 根据 函数类型 定义 函数指针 func* func1...= add; 3、通过 函数指针类型 定义 函数指针 首先 , 通过 typedef 关键字, 定义 函数指针 类型 , 类型名称为 func_ptr , 对应的函数的 参数列表是 2 个 int 参数...); 然后 , 通过 func_ptr 函数指针类型 , 定义 函数指针 , 直接使用 变量类型 变量名称 的方式定义 函数指针 ; // 根据 函数指针类型 定义 函数指针 func_ptr func2

    18830

    【C++】函数重载 ④ ( 函数指针定义的三种方式 | 直接定义函数指针 | 通过 函数类型 定义 函数指针 | 通过 函数指针类型 定义 函数指针 )

    的 返回值 不是 " 函数重载 " 的 判断标准 ; 二义性 : 如果 函数重载 与 默认参数 结合使用 , 出现了二义性 , 编译直接失败 ; 函数指针赋值重载函数 : 根据 函数指针 类型中的 参数列表类型...); return_type : 函数指针 指向的函数 的 返回值类型 ; func_ptr : 函数指针 名称 , 使用该 名称 也可以调用函数 , 用法与函数名相同 ; parameter_list..., 定义函数指针 , 直接根据指针的定义语法 指针类型* 指针名称 定义函数指针 , 同时将 add 函数 的 地址 赋值给 函数指针 ; // 根据 函数类型 定义 函数指针 func* func1...= add; 3、通过 函数指针类型 定义 函数指针 首先 , 通过 typedef 关键字, 定义 函数指针 类型 , 类型名称为 func_ptr , 对应的函数的 参数列表是 2 个 int 参数...); 然后 , 通过 func_ptr 函数指针类型 , 定义 函数指针 , 直接使用 变量类型 变量名称 的方式定义 函数指针 ; // 根据 函数指针类型 定义 函数指针 func_ptr func2

    20030

    智能指针:从基础、使用选择到原理

    C++11引入了智能指针的概念,它是一种对象,当其作用域结束时,它会自动删除所指向的对象。智能指针有助于防止内存泄漏,它们封装了原始指针,使得内存管理更加自动化。...C++11提供了三种类型的智能指针:std::unique_ptr,std::shared_ptr和std::weak_ptr。...memory>std::unique_ptr ptr(new int(5)); // ptr现在拥有一个int对象std::unique_ptr ptr2 = ptr; // 错误...std::weak_ptr是一种不控制所指向对象生存期的智能指针,它指向一个由std::shared_ptr管理的对象。...智能指针的底层实现原理智能指针的底层实现原理主要依赖于两个C++特性:模板和析构函数。模板:智能指针是模板类,可以接受任何类型的原始指针。

    9200

    【C 语言】指针数据类型 ( 指针类型变量 与 指针指向的内存块 概念区别 | 指针赋值 | 指针运算 | 内存赋值 | 内存取值 | 内存修改注意事项 )

    文章目录 一、指针类型变量 与 指针指向的内存块 概念区别 1、指针赋值 2、指针运算 3、内存赋值 4、内存取值 5、内存修改注意事项 一、指针类型变量 与 指针指向的内存块 概念区别 ---- 指针类型变量...与 指针指向的内存块 概念区别 : 给定一个指针类型变量 : // 定义一个普通整型变量 int a = 888; // 声明 指针类型变量 // 将整型变量地址赋值给指针类型变量 int *p =..., p + 1 与 p++ 的计算结果是指针的地址值加上指针类型对应的字节大小值 , 如果是 int 类型的指针 , 则增加 4 字节 ; 3、内存赋值 ** 给指针指向的内存赋值 * 给上述指针变量...: 给内存赋值 : *p 如果在 等号 = 左边 , 则表示给 指针 指向的 内存 赋值 ; 从内存取值 : *p 如果在 等号 = 右边 , 则表示从 指针 指向的 内存 取值 ; 5、内存修改注意事项...修改内存注意事项 : 给指针赋值时 , 要 确保指针指向的 内存 可以修改 , 全局数据区 中的 常量区 的值 不能修改 , 代码区 中的值不能修改 , 堆区 和 栈区 中的值 , 即使能修改 , 也要确保指针是正确的

    3K20

    指针(从零到一)【纯干货】【长期更新】

    我们发现不管是什么类型的指针,既然都是四个字节的大小,那么能不能做一个通用指针呢,为什么还要区分出各种类型的指针呢,答案当然是否定的。...= 0; return 0; } ​​​​​​ 由此可以看出指针类型的意义: 1.指针类型决定了,指针解引用的权限有多大(int类型指针解引用可以访问四个字节、char类型指针解引用可以访问一个字节...#include int main() { //这里的p就是一个野指针 int* p;//p是一个局部的指针变量,指针变量不初始化的话的,默认是一个随机值 *p = 20...,我们可以用这种方法 利用指针-指针模拟实现strlen的功能 ps:strlen函数的模拟实现方法在前面也有提到,链接附上C语言函数专题攻略附练习讲解(从0到1)【纯干货】(自定义函数+递归+应用实例...指针与数组之间的联系非常紧密,我在前面的博客中做了详细的介绍,这里不过多赘述,在此附上链接:数组【从零到一】【纯干货】-CSDN博客 在对指针有了更加深入的了解之后,我们写代码的时候就可以更加地灵活,

    12810

    EasyC++30,函数指针从进阶到放弃……

    在C++11当中提供了叫做auto的新特性,它可以帮助变量自动识别对应的类型,可以解决一些类型特别复杂的问题,比如: auto p2 = f2; 函数指针有两种调用方法,除了可以使用(*p2)的方式调用之外...其他的内容表明了该指针的类型。 由于我们定义的是一个数组,所以这里不能使用auto,因为自动类型推断只能用于单值初始化而不能用于初始化列表。...到这里还没结束,还有更恐怖的,如果我们想要定义一个指向这个数组的指针,应该怎么办呢?如果使用auto可以写成: auto ptr = &pt; 如果不使用auto呢?...我们进一步倒推,(*ptr)[3]这个数组当中的元素是什么类型呢?...而且这还不是最复杂的情况,比如函数的返回类型又是一个指向一个函数的指针……明摆着告诉我们含义我们仍然要推敲一会,如果在一段不明的代码当中遇到,可能会直接抓狂吧…… 也正因此,C++11当中推出了auto

    16510

    【C++】函数指针 ④ ( 函数指针做函数参数 | 使用函数指针间接调用函数 | 函数指针做参数 | 函数指针类型的本质 | 函数指针做参数意义 )

    , int); 定义函数 接收 pFun_add 类型的形参作为参数 , 该类型是 函数指针类型 , 也就是 函数接收一个 函数指针类型参数 , 在该函数中调用 函数指针 指向的 函数 ; // 传入函数指针...= add; // 通过函数指针间接调用 add 函数 pFun(7, 8); // 将 函数指针 作为参数传递到函数中 caculate(pFun, 9, 10); // 可以直接将...约定了 函数的 参与者 ; 函数返回值类型 约定了 函数的 执行结果 ; 只要 将 子任务 按照 上述 " 函数指针类型 " 的约定 , 开发出 符合要求 的 函数 , 就可以将其作为一个 子任务 传递到...; 错误处理 : 使用函数指针 , 将错误处理函数作为参数传递给其他函数 , 在发生错误时立即调用适当的错误处理函数 , 无需返回到调用堆栈中的较高层次 ; 二、代码示例 - 函数指针做函数参数 代码示例...(7, 8); // 将 函数指针 作为参数传递到函数中 caculate(pFun, 9, 10); // 可以直接将 函数名 ( 函数地址 ) 作为 函数指针 参数 // 传递给函数

    1.5K50

    【超详细指针系列】指针超详细讲解------从入门到应用-----一步一步将你带入深挖指针【1】

    这里的房间号其实就是地址!!!! 说回正题: 内存相比大家都不陌生,在你买电脑的时候总会了解到电脑是多少g内存的,如4G/8G/16G/32G而这些到底是怎么划分的哪????...指针类型的拆分 举个例子: 1.int a=10; int *p=&a; 我们已经知道,p的类型是int*类型 ‘*’是指p的类型是指针 int的意思是指p所指向的对象为整型(指向的是整型(int...注意指针变量的大小和类型是⽆关的,只要指针类型的变量,在相同的平台下,大小都是相同的。!!!...3.3 void* 指针 在指针类型中有⼀种特殊的类型是 void* 类型的,可以理解为⽆具体类型的指针(或者叫泛型指 针),这种类型的指针可以⽤来接受任意类型地址。...:如果该处出现错误,运行时会直接指出在哪里出的错,这对程序员真的真的很友好,可以省去大部分找error的时间。

    9610

    【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !

    指针的类型决定了它解引用时读取的数据类型。...1.3.1 不同类型的指针 常见的指针类型包括: 整数指针:int * 字符指针:char * 浮点数指针:float * 双精度指针:double * 不同类型的指针之间不能互相赋值,除非通过强制类型转换...free(p); // 正确释放内存 } } 1.6 指针的常见错误与调试 使用指针时,常见错误包括解引用空指针、使用未初始化的指针、内存越界等。调试这些错误需要细致的检查和使用调试工具。...1.6.2 调试工具 使用工具如gdb可以帮助发现和调试指针相关的错误。...10.2 解引用空指针(NULL) int *p = NULL; *p = 10; // 未定义行为,可能导致程序崩溃 解释和原理: 空指针(NULL)表示指针不指向任何有效的内存地址。

    17510

    数组类型与数组指针的巧妙利用

    本例通过存取结构, 慢慢引入了数组类型与指针的一些使用方法; 其中六个小例子的测试内容和结果都是一样的. ---- unit Unit1; interface uses Windows, Messages...'%s, %d', [buf^.F1, buf^.F2]); Dec(buf, 2); {回到开始} FreeMem(buf); {释放内存} end; {可以给结构定义一个数组类型...10; end; for i := 0 to 2 do ShowMessageFmt('%s, %d', [Arr[i].F1, Arr[i].F2]); end; {使用一个元素的数组指针..., 但可以用变量} {这也容易理解, 因为常量会直接编译到代码中, 在没有分配内存以前, 编译器不知道数组会更大} {要解决这个问题需要用下一个方法} // buf[0].F1 := 'A';...i := 0 to 2 do ShowMessageFmt('%s, %d', [buf[i].F1, buf[i].F2]); FreeMem(buf); end; {使用一个超大的数组指针

    79120
    领券