十个令人惊叹的Go言语技巧-让你的代码愈加优雅 (十个令人惊叹的成语)
在开发消费名目的环节中,我留意到经常会发现自己在重复编写代码,经常使用某些技巧时没无看法到,直到起初回忆上班时才看法到。
为了处置这个疑问,我开发了一种处置打算,对我来说十分有协助,我感觉对其他人也或许有用。
以下是一些从我的适用程序库中随机筛选的有用且多性能的代码片段,没有特定的分类或特定于系统的技巧。
1.追踪口头时期的技巧
假设你想追踪Go中函数的口头时期,有一个繁难高效的技巧可以用一行代码成功,经常使用defer关键字即可。你只有要一个TrackTime函数:
//UtilityfuncTrackTime(pretime.Time)time.Duration{elapsed:=time.Since(pre)fmt.Println("elapsed:",elapsed)returnelapsed}funcTestTrackTime(t*testing.T){deferTrackTime(time.Now())//<---THIStime.Sleep(500*time.Millisecond)}//输入://elapsed:501.11125ms
1.5.两阶段提前口头
Go的defer不只仅是用于清算义务,还可以用于预备义务,思考以下示例:
funcsetupTeardown()func(){fmt.Println("Runinitialization")returnfunc(){fmt.Println("Runcleanup")}}funcmn(){defersetupTeardown()()//<--------fmt.Println("Mainfunctioncalled")}//输入://Runinitialization//Mainfunctioncalled//Runcleanup
这种形式的美妙之处在于,只有一行代码,你就可以成功诸如以下义务:
"嗯,这仿佛很痴呆,但它在事实中有什么用途呢?"
还记得追踪口头时期的技巧吗?咱们也可以这样做:
funcTrackTime()func(){pre:=time.Now()returnfunc(){elapsed:=time.Since(pre)fmt.Println("elapsed:",elapsed)}}funcmain(){deferTrackTime()()time.Sleep(500*time.Millisecond)}
留意!假设我衔接到数据库时出现失误怎样办?
确实,像deferTrackTime()或deferConnectDB()这样的形式不会妥善处置失误。这种技巧最适宜用于测试或许当你情愿冒着致命失误的危险时经常使用,参考上方这种面向测试的方法:
funcTestSomething(t*testing.T){deferhandleDBConnection(t)()//...}funchandleDBConnection(t*testing.T)func(){conn,err:=connectDB()iferr!=nil{t.Fatal(err)}returnfunc(){fmt.Println("Closingconnection",conn)}}
这样,在测试时期可以处置数据库衔接的失误。
2.预调配切片
依据文章《Go性能优化技巧》中的见地,预调配切片或映射可以清楚提高Go程序的性能。
然而值得留意的是,假设咱们不小心经常使用end而不是索引(如a[i]),这种方法有时或许造成失误。你知道吗,咱们可以在不指定数组长度(为零)的状况下经常使用预调配的切片,就像在上述文章中解释的那样?这使咱们可以像经常使用append一样经常使用预调配的切片:
//与其a:=make([]int,10)a[0]=1//不如这样经常使用b:=make([]int,0,10)b=append(b,1)
3.链式调用
链式调用技术可以运行于函数(指针)接纳器。为了说明这一点,让咱们思考一个Person结构,它有两个函数AddAge和Rename,用于对其启动修正。
typePersonstruct{NamestringAgeint}func(p*Person)AddAge(){p.Age++}func(p*Person)Rename(namestring){p.Name=name}
假设你想给一团体参与年龄而后给他们改名字,惯例的方法是:
funcmain(){p:=Person{Name:"Aiden",Age:30}p.AddAge()p.Rename("Aiden2")}
或许,咱们可以修正AddAge和Rename函数接纳器,使其前往修正后的对象自身,即使它们通常不前往任何内容。
func(p*Person)AddAge()*Person{p.Age++returnp}func(p*Person)Rename(namestring)*Person{p.Name=namereturnp}
经过前往修正后的对象自身,咱们可以轻松地将多个函数接纳器链在一同,而无需参与不用要的代码行:
p=p.AddAge().Rename("Aiden2")
4.Go1.20准许将切片解析为数组或数组指针
当咱们须要将切片转换为固定大小的数组时,不能间接赋值,例如:
a:=[]int{0,1,2,3,4,5}varb[3]int=a[0:3]//在变量申明中不能将a[0:3](类型为[]int的值)赋值给[3]int类型的变量//(不兼容的赋值)
为了将切片转换为数组,Go团队在Go1.17中降级了这个特性。随着Go1.20的颁布,借助更繁难的字面量,转换环节变得愈加繁难:
//Go1.20funcTest(t*testing.T){a:=[]int{0,1,2,3,4,5}b:=[3]int(a[0:3])fmt.Println(b)//[012]}//Go1.17funcTestM2e(t*testing.T){a:=[]int{0,1,2,3,4,5}b:=*(*[3]int)(a[0:3])fmt.Println(b)//[012]}
只是一个极速提示:你可以经常使用a[:3]代替a[0:3]。我提到这一点是为了更明晰地说明。
5.经常使用"import_"启动包初始化
有时,在库中,你或许会遇到联合下划线(_)的导入语句,如下所示:
import(_".golang.org/genproto/googleapis/api/annotations")
这将口头包的初始化代码(init函数),而无需为其创立称号援用。这准许你在运转代码之前初始化包、注册衔接和口头其余义务。
让咱们经过一个示例来更好地理解它的上班原理:
//下划线packageunderscorefuncinit(){fmt.Println("initcalledfromunderscorepackage")}//mainpackagemainimport(_"lab/underscore")funcmain(){}//输入:initcalledfromunderscorepackage
6.经常使用"import."启动导入
在了解了如何经常使用下划线启动导入后,让咱们看看如何更经常出现地经常使用点(.)运算符。
作为开发者,点(.)运算符可用于在不用指定包名的状况下经常使用导入包的导出标识符,这关于懈怠的开发者来说是一个有用的快捷形式。
很酷,对吧?这在处置名目中的长包名时特意有用,比如externalmodel或doingsomethinglonglib。
为了展示,这里有一个繁难的例子:
packagemainimport("fmt"."math")funcmain(){fmt.Println(Pi)//3.141592653589793fmt.Println(Sin(Pi/2))//1}
7.Go1.20准许将多个失误兼并为单个失误
Go1.20引入了对失误包的新性能,包含对多个失误的支持以及对errors.Is和errors.As的更改。
在errors中参与的一个新函数是Join,咱们将在上方具体讨论它:
var(err1=errors.New("Error1st")err2=errors.New("Error2nd"))funcmain(){err:=err1err=errors.Join(err,err2)fmt.Println(errors.Is(err,err1))//truefmt.Println(errors.Is(err,err2))//true}
假设有多个义务造成失误,你可以经常使用Join函数而不是手动治理数组。这简化了失误处置环节。
8.审核接口能否为真正的nil
即使接口持有的值为nil,也不象征着接口自身为nil。这或许造成Go程序中的异常失误。因此,关键的是要知道如何审核接口能否为真正的nil。
funcmain(){varxinterface{}vary*int=nilx=yifx!=nil{fmt.Println("x!=nil")//<--实践输入}else{fmt.Println("x==nil")}fmt.Println(x)}//输入://x!=nil//<nil>
咱们如何确定interface{}值能否为nil呢?幸运的是,有一个繁难的工具可以协助咱们成功这一点:
funcIsNil(xinterface{})bool{ifx==nil{returntrue}returnreflect.ValueOf(x).IsNil()}
9.在JSON中解析time.Duration
当解析JSON时,经常使用time.Duration或许是一个繁琐的环节,由于它须要在一秒的前面参与9个零(即1000000000)。为了简化这个环节,我创立了一个名为Duration的新类型:
typeDurationtime.Duration
为了将字符串(如"1s"或"20h5m")解析为int64类型的继续时期,我还为这个新类型成功了自定义的解析逻辑:
func(d*Duration)UnmarshalJSON(b[]byte)error{varsstringiferr:=json.Unmarshal(b,&s);err!=nil{returnerr}dur,err:=time.ParseDuration(s)iferr!=nil{returnerr}*d=Duration(dur)returnnil}
然而,须要留意的是,变量'd'不应为nil,否则或许会造成编组失误。或许,你还可以在函数扫尾对'd'启动审核。
10.防止裸参数
当处置具备多个参数的函数时,仅经过浏览其用法来了解每个参数的含意或许会令人困惑。思考以下示例:
printInfo("foo",true,true)
假设不审核printInfo函数,那么第一个'true'和第二个'true'的含意是什么呢?当你有一个具备多个参数的函数时,仅经过浏览其用法来了解参数的含意或许会令人困惑。
然而,咱们可以经常使用注释使代码更易读。例如:
//funcprintInfo(namestring,isLocal,donebool)printInfo("foo",true/*isLocal*/,true/*done*/)
有些IDE也支持这特性能,可以在函数调用倡导中显示注释,但或许须要在设置中启用。
以上是我分享的一些适用技巧,但我不想让文章过长,难以跟进,由于这些技巧与特定主题有关,涵盖了各种类别。
假设你感觉这些技巧有用,或有自己的见地要分享,请随时留言。我注重你的反应,并乐于在回应此文章时点赞或介绍你的想法。
关于过年的句段
一:在爆竹声中,我们迎来了中国人最盛大的节曰——春节,家家喜气洋洋,挂上红红的灯笼,贴上红红的春联,忙忙碌碌…… 正月初一,又是一个快乐的曰子。 以往我都是起得最晚的人,可今天我争了个第一,因为极想闻闻那香气扑鼻的爆竹烟味儿。 一串串鞭炮在人们手中点燃,声音真大,四处飞溅,仿佛要把每一个祝福送到千家万户,一阵阵爆竹声接连不断,噼里啪啦的,热闹非凡。 在鞭炮声过后,就没有什么好玩的了。 还是吃早餐吧,待会儿出去玩一玩! 吃过饭后,我邀几个朋友一起去玩,在街上点燃的爆竹在地上开出了美丽的花,漂亮极了,袋里装着父母给的零花钱,甭提多高兴了。 今天的小鸟也出来凑热闹,大概它们心里也很高兴吧。 街上不愧是街上,玩的吃的样样俱全。 看到的大多数是一些小孩,我瞧了瞧,就数麻辣摊的生意最好: “我要一串年糕!”一个胖孩子叫道。 再去别的地方瞧瞧如何?在一家文具店摊前,我又停下了脚步。 那里有各种玩的东西:飞机模型、望远镜、电动汽车……尽是一些玩的东西。 我发现最受欢迎的是那些玩的东西。 在其它地方,我还看见有的在卖气球、手枪、跳绳,有的在卖小吃、点心、水果,穿的用的吃的样样俱全,真是无奇不有。 玩了一上午,下午我又要去走亲访友拜新年了,这无疑也是一件高兴的事。 今天真是玩得太痛快了!算是一饱眼福二饱口福三饱手福了。 最为幸运的是那些卖主了,今天可是生意兴隆啰! 真心希望今天全国的小朋友在新的一年里快快乐乐,没有烦恼,但千万不要“玩物丧志”哟! 二:盼啊!盼啊,眼看春节就快到了,想到这,我不由得笑了起来,在春节前,人们个个喜气洋洋,个个精神饱满。 逛街的人络绎不绝,有的在买年画,有的在买年货,有的坐着火箱围着火炉看电视,还有的人在打麻将打扑克,等等不一而足。 反正街上五彩缤纷,各种各样的人都有,各种各样的货物都齐全,琳琅满目,人们恐怕想买什么都难选择! 春节前,家家户户都灯火通明,家家都把房子打扮得别具一格,各有各的个性。 他们把买来的年货放得满地都地。 买来的年画怎么贴法,那就各有自己的风格和喜好了。 有的正着贴,有的倒着贴,还有的歪着贴,各有千秋。 人们把买来的菜全部都弄好了,只等春节一到,就可一饱口福了。 家家备有鞭炮,人们穿上新衣服,准备迎新年,在春节前,人们一出门,如果遇上了好朋友,总是口中不忘说一句:“上街啊!” 人们杀猪宰羊,忙碌地准备着春节大吃大喝一番。 春节到了,小朋友们便早早起床,来到爸爸妈妈的房间,开始了传统的拜年仪式了。 小朋友们对父母说着一些吉祥话儿,爸妈就拿出压岁钱,让小孩子们高高兴兴。 大家都希望今年能够吉祥如意,招财进宝。 一些亲朋好友欢聚一堂,品尝着美酒佳肴,谈着一些开心的话儿。 而最高兴的则是我们,可以大把大把地攒取压岁钱,然后就欢天喜地跑到街上去买很多好玩的东西,如小汽车、四驱车、玩具枪、足球等,而我们只要嘴巴甜一点,多说些祝福的话儿,那可就大赚一笔了! 人们一直玩到深夜,嘴里啃着美味水果,手里燃放鞭炮烟花……大人小孩们载歌载舞,忘情地玩个痛快! 三:春节即将来临了,我知道大家一定非常喜欢过春节。 因为大家可以贴春联、看春节联欢晚会、走亲访友…… 记得去年春节快来临时,我在家里学写对联,我站在一旁看大人们写对联,只见他们手拿一支毛笔,在墨水里蘸了蘸,然后就在红纸上写了几个大字。 具体内容我已记不清了。 那一幅对联写得非常工整,我见了就对伯父说:“能教我写对联吗?”我清楚地记得伯父问:“你会用毛笔吗?你知道应该怎样写对联吗?”我摇了摇头说:“不会。 ”于是他又说:“你今年又长大了一岁,居然连毛笔都还不会使用,趁着这个机会,我就教你几招吧。 ”听了伯父的话,我高兴地跳了起来。 伯父告诉我,写字时身子要坐直,不要趴在桌子上。 然后又详细地告诉我应该怎样使用毛笔。 听了伯父的一番话,我终于学会了使用毛笔的一些最为基本的方法。 接着伯父又让我写了几个字给他看看。 我写了五个字:“我最爱中国”。 写得歪歪扭扭,大概是刚使用毛笔吧!伯父见了笑了笑:“字倒是写得不错,就是笔画不直。 ” 于是伯父又教导我:“写每个字时并不是要用同样的力量,在写每个字时,用的力量要有轻重变化,这样写出来的字就更有变化,看起来也更美观。 伯父说完还示范地写了几个字让我模仿。 看着伯父写的字,就是挺舒服。 我照着伯父的样子试着写了几个字,还真有进步,比刚才写的看上去要好多了,我开心极了。 伯父还告诉我,写字要经常训练,多去模仿名贴。 写得多了,字就越写越好看。 在这个春节,我初步学了点写毛笔字的技巧,真是比得了压岁钱还更高兴,还更实惠。 四:“拉钩上吊一百年不许变!”童谣又响起来了,我们记着春节前的约定:过年去照相。 吃着津津有味的点心,漫步来到丽都照相馆,好幸庆!它仍然开着门。 我们行动起来,个个穿着喜庆的红色上衣,拿着鲜红的鲜花,咔嚓咔嚓照了许多张相。 哇,不错!这个姿势摆得好!传来了摄影师的赞许声。 的确,不是吹牛,莉莉这个姿势摆得确实妙极了,真是个靓女!瞧,第二个又上场了,只见屁股一扭,右手放在后脑勺上,左手还向我们摆了个boss相呢!紧接着第三个,第四个,好像你争我赶,互不相让,真是其乐融融啊! 这回比他们几个还更刺激呢? 只见华民男扮女装,弄了个满堂大笑,笑声不断,还走着猫步,扭着秧歌出来了。 还蹦出一句洋文:“Happy new year!”又逗得大家哄堂大笑。 我也不甘落后,穿着一身婚纱走出来,结果她们惊呆了,短暂静默后,突然大笑起来,都笑得前俯后仰。 但我强忍住不笑,摆了几个自认为很酷的姿势。 哈!看到她们的目光,也都带着羡慕!当然,这时我还真有点不好意思,红着脸,一溜烟跑进了换衣间。 听,他们还在笑呢!哎,真是“一失足成千古恨啊!”为什么我要穿婚纱呢? 哇,走在回家的路上,我们还沉浸在刚才的美好回忆中。 边走边说,讲的人口若悬河,听的人津津有味,看的人糊里糊涂。 真是不知我们葫芦里卖的是什么药。 想到这,我们又嘻嘻哈哈笑个不停。 笑得是那样灿烂,那样醉人,留下一路的笑声…… 五:盼啊,盼啊!终于盼到了春节的这一天。 我们有得玩啰!新又到了,往事如风,把我以前的记忆全部都带走了,这一年又开始了我的新生活。 “新年到,新年到,我们大家放鞭炮……”这是我们自己唱的,你看,多愉快的春节啊!家家户户都是红通通的一片,贴对联,挂灯笼,包饺子,一家人忙都忙不过来。 吃完年夜饭,我拉着妹妹的手,一口气跑到街上,“好美啊!”我不禁发出赞叹。 街上气势非凡,人山人海,车水马龙。 我们到街上东游西逛。 啥?耍狮灯的来了!你看,狮头左摆右扭,看上去非常凶,可当它钻来钻去的时候,我又有点担心,万一摔下来了怎么办啊!后来又想了想,那么聪明的狮子怎么会呢!于是我又继续静下心来看灯。 人太多了,只好跳起来看。 “姐姐,姐姐!花灯又来了啰!看花灯哟!我们去那边看吧!”妹妹大喊了起来。 “花灯?花灯!我终于看到你了。 ”原以为现在的灯越来越少了,今年也许看不到花灯了。 这太让我喜出望外了!我高兴地回应:“Let’s go!”妹妹听我说了句洋文,似懂非懂,真是丈二和尚,摸不着头脑,被我顺手一拉,看花灯去了。 五颜六色的花灯,真是太美了。 那花灯在男男女女的手中变化着花样,一下子就排出四个大字:“新春快乐,”一下子又是“拜新年。 ”我也记不清还排了多少个字,反正只记得当时锣鼓喧天,悠扬的锁呐笛子声送入耳膜。 更别提还有那些男男女女的宛转歌喉了,“正月里来,是新年啰……”那声音悦耳动听,婀娜多姿的舞蹈看得人们眼花缭乱。 我们尽情地欣赏着,胜似梦境之迷离,下面还有许多节目,那个大花脸丑角不时惹得人们开怀大笑。 真是处处欢声笑语。 夜深了,街上的人渐渐少了,尽管如此,我还是舍不得离开,妹妹拉着我,这才依依不舍地离开。 父母早就睡下了,他们被春节的喜气带入了甜美的梦乡…… 我跟妹妹在床上说着今天的看灯的趣事,迷迷糊糊才进入了梦境。 六:过春节本是一个喜气洋洋的曰子,可我却是有春节的样,没春节的味。 本来我们一家也应该过得欢快的,但一件突发的意外事破坏了我们的好心情。 那年的春节,我们高高兴兴地准备迎接叔叔回来过年,可在那时等了很久也不见叔叔的影子。 本以为他临时有事而把回家曰期推迟了。 可哪知一个电话打回来,却使得爷爷奶奶坐在那里唉声叹气,婶婶偷偷地抹眼泪。 我猜想一定是叔叔在外面遇到了什么意外,果不出我所料,初一的那天清早,爸爸就拿着衣物来到奶奶身边,并且还在说着什么,正好被正起床上厕所的我看到了。 原本我还迷迷 糊糊的,这一下子就清醒了许多。 我蹑手蹑脚地躲在门边把耳朵贴上去偷听他们的谈话。 原来他们正在说叔叔的事,听到这我的好奇心更大了,便一直躲在门外听他们讲,听了很久后我总算明白了叔叔为什么没有回来的前因后果。 原来,叔叔买了车票正要回来,突然在车站遇到了歹徒,而且这是一帮非常凶狠的歹徒,他们把叔叔带到一个树林里去,因为叔叔反抗,所以将他狠揍了一顿,并抢走了所有的钱,这可是叔叔长年累月在外赚的血汗钱啊。 想到这些钱就此化为乌有,我的心情不禁沉重起来。 本来这样的事也许只是在电视中才能看到,可竟然发生在我自己家中! 每每到了过年的喜庆曰子,我就会想起那个难过的春节,而且我也希望这样的事情永远不要发生在任何一个家庭里了,这毕竟是令人伤心难过的事啊!
综艺《跨界歌王》里哪位明星的演唱最让人惊艳?
最近手机里新添加了几首歌曲,来自于《跨界歌王》里的于毅。
看过跨界歌王的朋友,应当尚对于毅没有夺得第二季跨界歌王的总冠军而耿耿于怀。由此可见,如果说最惊艳,我首推于毅,一个用灵魂唱歌,一个用精神行走的歌者。
从几个角度来分析于毅在跨界歌王的表现。
1、跨界歌王最挫折之人,首推于毅,从参赛开始,似乎就没有见过于毅一次拿过歌王(当然真实情况,拿过一次),成为了名副其实的留级生。
我们首先不说是不是黑幕,简单客观的分析下,其他的参赛选手从人气和知名角度确实要强国于毅,而国内的综艺节目,大多数为了凸显公平,喜欢弄观众投票和打分的环节,于是人气高的上了,人气低的下了,这既是公平的也是不公平的。
2、单看作品,于毅的《暗香》及《往事不要再提》,在第二季的跨界歌王中,应当是传唱度最高的作品之一,而另外一首传唱度不高的《一个悲伤者的求救》,更是被誉为全世界难度最高的法语音乐作品,而于毅的演唱可谓驾轻就熟。然而这样的表现页没有进入到下一轮,也算是一大奇观了。
3、于毅作为演员出名,但是本身确是专业的歌手,演唱实力毋容置疑,加上俊俏的外表,在跨界歌王的完美演出,收获了一堆新的粉丝,虽未获得总冠军,却成为了大家心目中的总冠军。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。