Go语言在解决实际问题时的优点与不便

2023-12-04 00:38

本文主要是介绍Go语言在解决实际问题时的优点与不便,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • Go 语言
  • 不便之处
    • 三目运算符
    • if 单行语句也要加大括号
  • 优秀特性
    • 多个变量同时赋值
    • defer 声明
    • goroutine 并发
  • 总结

前言

Go语言,全称golang,是Google开发的一种静态强类型、编译型、并发型并具有垃圾回收功能的编程语言。 从2007年末由 Robert Griesemer、Rob Pike、Ken Thompson 主持开发,其中的 Ken Thompson 可是和 Dennis Ritchie 一起发明了C语言的大佬。Go 语言于2009年11月正式宣布成为开放源代码项目, 并在2012年初,发布了Go 1.0稳定版本,此后便开启了稳步发展的道路。

Go 语言

作为一个从2007年开始诞生的语言,在庞大的语言家族中算是一个晚辈,和C++、Python这种老牌语言相比查了将近20年,和 C 语言相比资历就更低了,但是这个新晋的语言在 Google 光环的强大加持下也在飞速发展着,由于前辈们在发展的途中趟了很多坑,所以 Go 在发明之初就避免了其他语言的很多不便,可以说是站在巨人的肩膀上发展起来的。

但是即便这样,Go 语言的特点也不能被所有人喜欢,和许多人一样,我在学习这门语言的过程中也发现一些很方便特性和一些不太方便的特点,下面简单说几个点,有不对的地方希望小伙伴能及时指出,防止我在错误的思想上越走越远(怎么有种新闻发言稿的感觉~)。

不便之处

这里的不便之处只是我在使用过程中感觉不太方便,可能很多人并没有这个感觉,或许还有很多其他的解决方法和替代方案,烦请小伙伴能指点一下。

三目运算符

这个三目运算符是个很常用的逻辑处理部件,也是我在逻辑中经常使用到的,在Python、Lua等语言中也不存在,但是我都找到了简单的替代方式,但是在Go 中不得不写成中规中矩的 if 条件判断,这让很多算法的解题代码看起来并不那么优雅,比如一个简单的约瑟夫环问题:

N个人围成一圈,从第一个人从开始报数,报到m的人出圈,剩下的人继续从1开始报数,报到m的人出圈;如此往复,直到所有人出圈,输出最后一个出圈人最初始的编号。

这个问题的解法最简单的是模拟法,使用数组模拟一个环来按照规则运行,最后一个出圈的人的编号就可以输出到结果,还有一种思路就是找规律,可以找到出圈前后的序号对应关系,进而写出一行代码的解决方案。

// 索引从0开始,只要对结果加1就好了
int joseph_ring(int n, int m) {return n == 1 ? 0 : (joseph_ring(n - 1, m) + m) % n
}

但是在没有三目运算符的 Go 中要实现这个算法,就不得不多写几行了,和 C 语言相比就没有那么简洁了。

func joseph_ring(n int, m int) int {if n == 1 {return 0}return (joseph_ring(n - 1, m) + m) % n
}

if 单行语句也要加大括号

Go 语言本身带有自己的格式化命令,可以保证编写时不同的缩进样式格式化之后得到相同的代码,if 后面的条件语句可以不加小括号,但是后面的语句块必须加大括号,这样的规定对于我经常写的代码有点不太友好,比如下面这些C++代码:

if (a > 0)break;if (b < 0)continue;if (c == 0)return;

有时候为了看起来紧凑,可能会写成这样:

if (a > 0) break;
if (b < 0) continue;
if (c == 0) return;

但是放到 Go 语言中,就不得不写成好几行了,并且还要加大括号,看起来代码有些松散。

if a > 0 {break;
}if b < 0 {continue;
}if c == 0 {return;
}

优秀特性

上面提到了 Go 语言中不方便的地方,现在可以来说说 Go 语言相对于 C、C++ 更优越的特性:

多个变量同时赋值

在 C++ 中交换两个变量的通常使用中间变量来完成,比如交换 ab 两个变量的值:

int a = 1;
int b = 6;int tmp = a;
a = b;
b = tmp;

针对于这种整形的变量,一些大牛们发明了特殊的算法来处理,避免使用中间变量:

int a = 1,;
int b = 6;a = a ^ b
b = b ^ a
a = a ^ b

但是在 Go语言中这种情况非常好处理,直接从左到右依次赋值就好了

var a int = 1
var b int = 6b, a = a, b

defer 声明

defer 可以用于在当前函数返回前执行一些清理代码,而不管此函数如何退出。defer 在函数中可以随时出现,这使得清理代码可以尽可能在需要清理的地方运行,比如我们常常要释放申请的资源,常见的需要释放的资源有文件描述符:

file, err := os.Open(fileName)
if err != nil {return
}
defer file.Close()

有了 defer 终于不再在担心,资源没回收的问题,也不用在各个提前返回的条件分支中添加释放资源的重复代码了。

goroutine 并发

goroutine 是Go并行设计的核心,说到底其实就是协程,但是它比线程更小并且在Go语言内部帮你实现了这些 goroutine 之间的内存共享。执行 goroutine 只需要极少的栈内存,可同时运行成千上万个并发任务。goroutine 一定程度上比 thread 更易用、更高效、更轻便。

使用起来也非常方便,创建 goroutine 只需在函数调用语句前添加 go 关键字,就可以创建并发执行单元。开发人员无需了解任何执行细节,调度器会自动将其安排到合适的系统线程上执行,这是解放生产力的又一创举,简单示例代码如下:

package mainimport ("fmt""time"
)func new_task() {for i := 0; i < 10; i++ {fmt.Println("this is a newTask")time.Sleep(time.Second) //延时1s}
}func main() {for i := 0; i < 3; i++ {go new_task() //新建一个协程, 新建一个任务}time.Sleep(time.Second * 15) //延时15sfmt.Println("this is a main goroutine")
}

总结

  • Go 语言作为编程语言中的新晋小弟,吸收了前人的经验,现阶段发展迅猛
  • 虽然 Go 出于一些目的规定了语言的标准,但是类似于没有三目运算符这种特点还是有些不方便
  • Go 这门语言还很年轻,相信随着不断发展它会越来越优秀,但没有任何语言是完美无缺的

==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==

陪伴是最长情的告白,而守护是最沉默的陪伴。国庆中秋双节合并,放假了,陪家人待在一起真的很开心,什么都不用做,就静静的待在一起很满足,聊聊天、抬抬杠,假期嗖嗖嗖地溜掉了~

这篇关于Go语言在解决实际问题时的优点与不便的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/451467

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring