Golang Go语言中大佬们这段代码怎么优化,这么多if判断

发布于 1周前 作者 songsunli 来自 Go语言

大佬们这段 golang 代码怎么优化,这么多 if 判断

        ...
	col := column.typeFn(column.ctype)
    //primaryKey
if column.ColumnFn["primaryKey"] != nil {
	col = col + column.ColumnFn["primaryKey"](column)
}
//autoIncrement
if column.ColumnFn["autoIncrement"] != nil {
	col = col + column.ColumnFn["autoIncrement"](column)
}

//default
if column.ColumnFn["default"] != nil {
	col = col + column.ColumnFn["default"](column)
}
//notNull
if column.ColumnFn["notNull"] != nil {
	col = col + column.ColumnFn["notNull"](column)
}

//comment
if column.ColumnFn["comment"] != nil && !column.Add {
	col = col + column.ColumnFn["comment"](column)
}
   ...


Golang Go语言中大佬们这段代码怎么优化,这么多if判断

更多关于Golang Go语言中大佬们这段代码怎么优化,这么多if判断的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

23 回复

sth like this?

<br>col := column.typeFn(column.ctype)<br><br>constraints := []string{"primaryKey", autoIncrement", "default", "notNull", }<br>for _, cs := range(constraints) {<br> if column.ColumnFn[cs != nil {<br> col = col + column.ColumnFn[cs](column)<br> }<br>}<br>

更多关于Golang Go语言中大佬们这段代码怎么优化,这么多if判断的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


能用就不要动,重构是非常费力不讨好的事情

谢谢大佬们

GPT3.5
您可以通过将相似的逻辑整理成一个函数,并使用循环来遍历需要执行的函数,以减少代码的冗余。以下是一个优化后的示例:

go
Copy code
// 定义一个函数类型,用于处理特定的 ColumnFn
type ColumnFuncHandler func(column *Column) string

// 处理 ColumnFn 的函数
func processColumnFn(column *Column, fnName string, fnHandler ColumnFuncHandler) string {
if column.ColumnFn[fnName] != nil {
return fnHandler(column)
}
return “”
}

// 处理所有 ColumnFn 的函数
func processAllColumnFns(column *Column) string {
var result string

// 定义需要处理的函数名列表
fnNames := []string{“primaryKey”, “autoIncrement”, “default”, “notNull”, “comment”}

// 遍历函数名列表,执行相应的处理函数
for _, fnName := range fnNames {
result += processColumnFn(column, fnName, column.ColumnFn[fnName])
}

return result
}

// 在你的代码中调用 processAllColumnFns
col := column.typeFn(column.ctype) + processAllColumnFns(column)
通过这种方式,您可以将重复的逻辑整理到函数中,并通过循环来遍历需要执行的函数。这样可以使代码更加清晰、可维护,并减少冗余。同时,如果以后需要添加或删除某个 ColumnFn ,只需在 fnNames 中进行相应的修改,而不必在每个条件语句中进行更改。

挺好的,清晰明了。别改了。

col := column.typeFn(column.ctype)

// 定义需要按顺序处理的列属性
columnAttributes := []string{“primaryKey”, “autoIncrement”, “default”, “notNull”, “comment”}

for _, attr := range columnAttributes {
if fn, ok := column.ColumnFn[attr]; ok && (attr != “comment” || !column.Add) {
col += fn(column)
}
}

我是直接问 chatgpt 的。

我建议更名叫 v2ai 😎

挺好的.一眼明了
见过这种代码吗
<br>a:=xxx<br>//一些简单的代码<br>b:=a<br>//一些简单的代码<br>c:=b<br>//一些简单的代码<br>d:=c<br>

清晰明了,我看写得挺好。楼里唯一能认同的理由是行数多,这个可以用表驱动来合并,特别注意的是,我建议一行一个策略,不然排序、合并代码冲突的时候要傻眼的

确实写的比我好

怎么没人提 validator 呢

struct tag 就是设计来简化这坨没必要的 if 判断的

var col strings.Builder
col.WriteString(column.typeFn(column.ctype))

// column functions
columnFns := []string{“primaryKey”, “autoIncrement”, “default”, “notNull”, “comment”}
for _, fn := range columnFns {
if column.ColumnFn[fn] != nil {
col.WriteString(column.ColumnFnfn)
}
}

finalCol := col.String()

#13 这个感觉更像是 ORM 建表那里?不太像是参数检查。

看起来不够酷,确是最简洁高效的

简洁明了,如果是别人写的就不要改了。另外行数也挺多的,如果用行数来考核的话,也能取得不错的成绩。

从命名推测 ColumnFn 应该就是所有要调用的处理函数,如果是要添加一个新的方法,为了方便扩展,那直接这样就可以吧
for n, cf := range column.ColumnFn {
col = col + cf(column)
}

如果不是为了扩展,那还是别闲的没事改代码了。。。

这个错了,看起来是在拼字符串?这样就乱序了。。。

<br>keys := []string{"primaryKey", "autoIncrement", "default", "notNull", "comment"}<br><br>for _, key := range keys {<br> if column.ColumnFn[key] != nil {<br> if key != "comment" || !column.Add {<br> col = col + column.ColumnFn[key](column)<br> }<br> }<br>}<br>

代码最重要的可读性

别改,这段代码我觉得写的非常好,没有优化的必要。

循环需要保证模式相同,前人写这个代码可能就是怕后期增加不同模式的判断。

在Go语言中,减少多个if判断的常见优化策略包括使用switch语句、映射(map)、策略模式或重构代码逻辑以减少条件判断。不过,具体优化方法需要根据代码的具体上下文来决定。

  1. 使用switch语句:如果多个if判断是基于同一个变量的不同值,可以考虑使用switch语句来替代,这会使代码更加清晰。

  2. 使用映射(map):如果if判断是基于键值对,可以使用map来替代,通过直接访问map来减少判断次数。例如,将条件作为map的key,将对应的处理逻辑作为value。

  3. 策略模式:对于复杂的业务逻辑,可以使用策略模式,将每种情况的处理逻辑封装到独立的函数中,然后根据条件调用相应的函数。

  4. 重构代码逻辑:有时候,过多的if判断可能是因为代码逻辑设计不合理。尝试重构代码,提取公共逻辑,减少条件判断。

  5. 使用早期返回:在函数内部,如果某个条件满足后可以立即返回,那么可以立即返回,减少后续的if判断。

  6. 使用布尔表达式:有时候,可以通过组合布尔表达式来减少if判断的数量。

建议上传具体的代码片段,这样我可以给出更具体的优化建议。总的来说,优化代码的关键在于理解业务逻辑,然后寻找最合适的重构方法。

回到顶部