关于语言:每天学点-Go-规范-函数传参时struct-应该传值还是引用
当初团队里简直所有的代码都须要通过 Code Review(代码审查)之后才容许合入主分支。笔者在 CR 中看到了不少不适宜的问题,也看到了不少值得学习的点,于是决定一点一滴地记录这些做法、教训、教训,以飨读者。如有谬误,也欢送读者不吝指正。 上一篇文章: context 类型的 key 有什么考究? 一句话标准问题背景可能存在问题解决办法应用值传递的长处什么时候应该应用援用传递一句话标准当函数的入参、出参是一个构造体时,如无必要,应用值传递而不是援用传递问题背景当咱们用 Go 开发时,对外裸露一个函数 / 办法时,以构造体作为函数的入参或出参,是十分常见的。比如说,咱们实现上面的一个函数,返回一个用户信息。 比如说,咱们提供两个函数,别离用来获取相干用户的权限信息: package permissiontype UserPermission struct { UserID string Permissions []string}// GetUserPermissions 获取指定 user ID 的权限func GetUserPermissions(userID string) *UserPermission// SetUserPermissions 设置指定 user ID 的权限func SetUserPermissions(permission *UserPermission) error能够看到,在下面的代码中,UserInfo 作为出入参都是以指针存在的。这种模式的代码十分多,也十分典型,而且大家都会习惯于这么写,特地是有面向对象思路的程序员。 那么,这么写能够吗?有什么问题呢?其实这个要具体问题具体分析,上面咱们就来一起看一看。 可能存在问题假如有一个新需要,是复制一个用户的权限给新用户。这逻辑看起来挺简略,代码里这么写,齐全是荒诞不经的: // CopyUserPermissions 复制用户权限func CopyUserPermissions(ctx context.Context, fromUserID, toUserID string) error { pms := permission.GetUserPermissions(fromUserID) pms.UserID = toUserID return permission.SetUserPermissions(psm)}这种写法,节俭了内存应用,逻辑也十分清晰,code review 的时候直呼赞。 有什么问题吗?隐含的问题不在 CopyUserPermissions 上,而在 GetUserPermissions 中。有时候某些数据,咱们可能是通过本地缓存来实现的,基于这种模式,GetUserPermissions 外部的逻辑就有可能是: ...