草庐IT

golang初探

来风 2023-03-28 原文

最近两天对go语言做了一个初步的了解,记录一下。之前没有按照原创发表,所以重新发布一次。

第一个感受就是使用起来方便,从官网下载安装包,参考https://golang.google.cn/doc/install,解压到/usr/local/go目录,然后将go目录下的bin目录添加到环境变量即可export PATH=$PATH:/usr/local/go/bin,最后运行go version查看是否生效,编写一个简单的go文件,直接go run hello.go即可运行起来了。

如果要使用vscode进行调试也非常方便,安装go相关的插件即可(ctrl+shift+p,输入go:install),注意开国内代理go env -w GOPROXY=https://goproxy.cn。然后在main函数的那个文件按F5就可以调试了,可以打断点看堆栈变量的值,我是用的wsl2配的centos7,体验很不错。

学习过c/c++后,对go的学习就更加容易了,很多基本都是c相关的语法,增加了一些新特性,比如gc,goroutine协程,channel通道,对于高并发编程更加方便,一个协程类似于用户态轻量级现场,采用go加函数名的方式运行,在一个协程里面可以通过channel的方式将值传到另外的协程,channel类似于管道的概念,这样多个协程直接就可以通信了。

go语言编程时对格式有要求,比如左花括号不能换行,vscode保存时会自动格式化代码,看起来还是很清爽的。

注意go没有继承的概念,但可以实现面向对象的多态,主要是通过interface的方式,只要某个struct实现了该interface里面的所有方法,就可以将该struct看作该interface的具体实现,类似于java里面的implement,只是省略了该关键词,对该方法就可以实现多态调用,即定义变量用interface类型,实例化为某个struct类型,该变量调用interface的方法其实就是调用interface的实现的方法了。这里的interface其实类似于c++里面的抽象类,抽象类里面只给方法,不给具体实现,由继承的子类来完成实现,一个struct可以实现多个interface的接口,相当于多重实现了。

但go可以通过组合的方式实现伪继承,直接在struct里面写上需要基础的struct的名字,这个struct的变量和成员就继承下来了,写多个struct的名字,就相当于c++里面的多重继承了,如果子类和父类有相同的成员,调用时优先选择子类的,如果子类没有,而多个父类有相同的成员,那调用时就需要指定是哪一个父类,否则就报错了。

至于封装特性,可以将package下面go文件里面的struct名字以小写字母开头,这样就是私有的了,struct里面的成员也以小写字母开头,如果要public属性,就已大写字母开头,然后写一个new的方法,该方法以大写字母开头,这样就是公有的了,类似于c++里面的构造函数,如果要访问或者改写struct里面的私有成员 就可以写一个以大写字母开头的set/get函数,这样就可以在包外调用了,这里是权限访问主要是通过大小写开头来控制的,省略了public和private的关键词。

go采用package的方式进行工程管理,包名一般为文件夹的名字,文件夹下面有很多go源文件,一个包名类似于cpp里面的namespace,如在一个go文件中要使用另外一个包里面的成员,就需要在文件头加入import,比如import “fmt”,这个fmt就是标准库的一部分,目前go的标准库比较丰富,很多功能直接接入标准库即可完成,类似于python,减少了很多造重复轮子的代码量。

另外一个要说的是,c++和java都有异常处理的机制,抛出异常后catch,go也有这样的机制,只是名字不一样,go通过panic抛出error信息,通过recovery()捕获错误,一般将recovery放在defer中,一个函数中可以有多个defer,是以栈的方式存储,函数退出时反向调用defer,相当于出栈,所以可以在defer里面捕获错误,这个defer有点类似java里面的finally。go对有返回error的函数必须处理其错误,除非该函数的返回值也不考虑,就可以不处理error。

本文作者: nephen
本文链接: https://www.nephen.cn/posts/570203e5/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!

有关golang初探的更多相关文章

  1. 华为OD机试Golang解题 - 任务总执行时长 - 2

    华为Od必看系列华为OD机试全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理已参加机试人员的实战技巧华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典文章目录华为Od必看系列使用说明本期题目:任务总执行时长题目输入输出示例一输入输出说明go代码实现华为OD其它语言版本

  2. 【编程实践】Golang 获取HTTP请求的IP地址 - 2

    目录Golang获取HTTP请求的IP地址HTTP的发展历史3,HTTP所在的网络层次4,HTTP请求与响应

  3. 只能写作文?那必须安排一条龙服务[ChatGPT的应用场景初探] - 2

    0.引言在日常学习和工作中,我们经常需要进行写作,而写作不仅需要语言技巧和文学知识,还需要丰富的素材和思维的深度。随着人工智能技术的发展,ChatGPT等工具已经能够帮助我们解决这一问题。本文将介绍ChatGPT的应用场景以及如何使用它来进行写作。1.话题和题干成年人的心动有多珍贵心动是珍贵的瞬间,它推动我们追求梦想,给我们带来无限的希望。请描述一下你或他人在心动的鼓舞下所做出的努力,并论述心动对成年人生活的重要性。例如,当你爱上一个人的时候,你会有怎样的心动感受;当你为了实现梦想而奋斗时,心动会给你带来怎样的支持。题目自拟,字数800。2.写作思路描写男女邂逅的事情有可能落入俗套。所以,我们

  4. Golang SQL 查询语法 - 2

    关闭。这个问题需要debuggingdetails.它目前不接受答案。编辑问题以包含desiredbehavior,aspecificproblemorerror,andtheshortestcodenecessarytoreproducetheproblem.这将有助于其他人回答问题。关闭4年前。Improvethisquestion在golang代码中使用sql查询获取语法错误。golang中此SQL查询所需的正确语法:rows,errQuery:=dbCon.Query("SELECTB.LatestDate,A.SVRNameASServerName,A.DRIVE,A.Tot

  5. go - 在golang中的表达式中检查括号是否平衡[保持] - 2

    给定表达式字符串exp,编写程序检查exp中“{”、“}”、“(”、“)”、“[”、“]的对和顺序是否正确。packagemainimport("fmt"stack"github.com/golang-collections/collections/stack")funcmain(){s:="(a[0]+b[2c[6]])){24+53}"stackO:=stack.New()stackmap:=map[string]string{"[":"]","(":")","{":"}"}varstr=""for_,num:=ranges{str=string(num)if(str=="{"||

  6. Golang libphonenumber - 2

    关闭。这个问题是notreproducibleorwascausedbytypos.它目前不接受答案。这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topic在这里,这个问题的解决方式不太可能帮助future的读者。关闭3年前。Improvethisquestion如何通过使用此库在golang中传递数字来获取国家代码:https://godoc.org/github.com/nyaruka/phonenumbers?

  7. go - func 的语法 Golang 错误 - 2

    为什么下面的代码会抛出意外的函数错误?我看到错误./func_correct.go:4:syntaxerror:unexpectedfunc,expectingnamepackagemainfunc(st*Stack)Pop()int{v:=0forix:=len(st)-1;ix>=0;ix--{ifv=st[ix];v!=0{st[ix]=0returnv}}return0}funcmain(){Pop()} 最佳答案 定义堆栈类型在main中为其创建一个变量对其调用Pop代码:packagemainimport"fmt"typ

  8. go - 进程花费了太长时间程序退出:Golang错误 - 2

    Thisquestionalreadyhasanswershere:ForloopoftwovariablesinGo(3个答案)2年前关闭。我正在通过Gotour在Go中使用for循环我跑的时候packagemainimport"fmt"funcmain(){sum:=1forsum程序运行正常,输出为1024但是当我更改sum:=0时packagemainimport"fmt"funcmain(){sum:=0forsum它给出了错误的说法processtooktoolongProgramexited.编辑:我沉迷于Go巡回赛,以至于我无法意识到,我犯了一个逻辑错误:P。

  9. json - 如何在golang中将结构解码到 map 中 - 2

    关闭。这个问题需要debuggingdetails.它目前不接受答案。编辑问题以包含desiredbehavior,aspecificproblemorerror,andtheshortestcodenecessarytoreproducetheproblem.这将有助于其他人回答问题。关闭4年前。Improvethisquestion我有一个Json:{"id":"me","name":"myname","planets":{"EARTH":3,"MARS":4}}我不知道如何将planets字段解码为map[string]int,所以我将访问元素而无需解码它们,就像在这个例子中一样

  10. mysql - golang MySQL "connection refused" - 2

    我是Go(Golang)的新手。我写了一个简单的基准程序来测试MySQL的并发处理。当我增加并发channel数时,不断收到“dialtcp52.55.254.165:3306:getsockopt:connectionrefused”、“unexpectedEOF”错误。每个go例程都将1到n行批量插入到一个简单的客户表中。该程序允许设置可变插入大小(单个语句中的行数)和并行go例程的数量(每个go例程执行上面的一个插入)。程序在小数字row寻找线索。基于它们,我设置了数据库最大连接数以及“max_allowed_pa​​cket”和“max_connections”。我还设置了go

随机推荐