体验golang语言的风骚编程

androidstarjacksky · · 836 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

最近想搞搞后台开发,话说注意力就转移到了公司用的golang。用Go做微服务比较方便,或许是因为golang强悍的语法吧,看到go的语法,自己已被深深的吸引。关于学习后台如何选择可以参考《[做后台是选择Java 、Go ,还是 PHP?》](https://mp.weixin.qq.com/s/1BL-HoRWgLb8DKNZqxGbRw) 来我们一起感受下Go的风骚式的代码风格。 ### 1、魔鬼式变量声明 ![ ](https://upload-images.jianshu.io/upload_images/14371339-0c72ecfda712e1d2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ### 2、数组的声明 ![ ](https://upload-images.jianshu.io/upload_images/14371339-01c0d004d8361713.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) **array就是数组,它的定义方式如下:** var arr [n]type 在[n]type中,n表示数组的长度,type表示存储元素的类型。对数组的操作和其它语言类似,都是通过[]来进行 读取或赋值: ``` var arr [10]int // 声明了一个int类型的数组 arr[0] = 42 // 数组下标是从0开始的 arr[1] = 13 // 赋值操作 fmt.Printf("The first element is %d\n", arr[0]) // 获取数据,返回42 fmt.Printf("The last element is %d\n", arr[9]) //返回未赋值的最后一个元素,默认返回0 ``` 由于长度也是数组类型的一部分,因此[3]int与[4]int是不同的类型,数组也就不能改变长度。数组之间的赋值是 值的赋值,即当把一个数组作为参数传入函数的时候,传入的其实是该数组的副本,而不是它的指针。如果要使用指 针,那么就需要用到后面介绍的slice类型了。 数组可以使用另一种:=来声明 ``` a := [3]int{1, 2, 3} // 声明了一个长度为3的int数组 b := [10]int{1, 2, 3} // 声明了一个长度为10的int数组,其中前三个元素初始化为1、2、3,其它默认为0 c := [...]int{4, 5, 6} // 可以省略长度而采用`...`的方式,Go会自动根据元素个数来计算长度 ``` ### 3、 go语言强大的slice操作 golang 中的 slice 非常强大,让数组操作非常方便高效。在开发中不定长度表示的数组全部都是 slice 。但是很多同学对 slice 的模糊认识,造成认为golang中的数组是引用类型,结果就是在实际开发中碰到很多坑,以至于出现一些莫名奇妙的问题,数组中的数据丢失了  *slice* 的数据结构,它很简单,一个指向真实 *array* 地址的指针 *ptr* ,*slice* 的长度 *len* 和容量 *cap* 。 ![ ](http://upload-images.jianshu.io/upload_images/14371339-3b8fb2f9cd03173a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![ ](http://upload-images.jianshu.io/upload_images/14371339-624afe6bed881351.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 其中 len 和 cap 就是我们在调用 len(slice) 和 cap(slice) 返回的值。 我们来按照 slice 的数据结构定义来解析出 ptr, len, cap // 按照上图定义的数据结构 ``` type Slice struct { ptr unsafe.Pointer // Array pointer len int // slice length cap int // slice capacity ``` 示例代码 ![ ](https://upload-images.jianshu.io/upload_images/14371339-cfbc6e024117acf5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ### 4、map的声明 **注意**由于go语言是一个强类型的语言,因此hashmap也是有类型的,具体体现在key和value都必须指定类型,比如声明一个key为string,value也是string的map, 需要这样做 ![ ](https://upload-images.jianshu.io/upload_images/14371339-5a547d3a26da3375.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) go语言中的枚举 ![ ](https://upload-images.jianshu.io/upload_images/14371339-88ad284cd4aa99a1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ### 5、for循环的遍历 ``` func formapTest() { var arrayi= [...] int{1, 2, 3, 4, 5, 6, 7, 78, 9, 10} for index, c := range arrayi { fmt.Printf("array[%d] = %d", index, c) } str := "go语言的学习和啪啪" for i, ch := range str { fmt.Println(i, ch) //ch的类型为rune unicode编码 } //输出为:28907 (Unicode编码时,两个字节代表一个字符) n := len(str) for i := 0; i < n; i++ { ch := str[i] // 依据下标取字符串中的字符,类型为byte fmt.Println(i, ch) //输出为utf-8编码,一个汉字字符占三个字节 } array := []rune(str) n = len(array) for i := 0; i < n; i++ { ch := array[i] // 依据下标取字符串中的字符,类型为byte fmt.Println(i, ch) //unicode 编码转十进制输出 //golang中字符类型的实际数据类型为uint32,以for循环遍历的方式输出结果都是Unicode编码的 } //var str string= "yyh,hello,卡卡论坛,好厉害哦" //fmt.Print(str) fmt.Print("\n================================\n") for i , ch := range str{ //fmt.Printf("(%d, %c)",i,ch) fmt.Printf("(%d, %x)",i,ch) } fmt.Print(utf8.RuneCountInString(str)) fmt.Print("================================\n") bytes := [] byte(str) //for len(bytes) > 0 { r, size := utf8.DecodeRune(bytes) fmt.Printf("%c %d",r,size) //} fmt.Println() fmt.Println() fmt.Println() for i,c := range bytes{ r,_ :=utf8.DecodeRune(bytes) fmt.Printf("%d %c %x \n",i,r,c) } for i ,ch := range []rune(str){ fmt.Printf("%d: %c ",i,ch) } str2 := "123 我按时 的发ad fg票 是否 adfg 发 发生a f发 的sj df" sps := strings.Split(str2," ") sps = strings.Fields(str2) var isContact = strings.Contains(str2,"你们") fmt.Println(sps) fmt.Println(isContact) } ``` ### 6、 golang中的结构体和继承 ![ ](https://upload-images.jianshu.io/upload_images/14371339-d534a32a2198b862.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ### 7、 golang中的接口 ![ ](https://upload-images.jianshu.io/upload_images/14371339-b71b428e91e1b1d4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ### 8、 golang中的空interface 类似于java中的object,空interface(interface{})不包含任何的method,正因为如此,所有的类型都实现了空interface。空interface对于 描述起不到任何的作用(因为它不包含任何的method),但是空interface在我们需要存储任意类型的数值的时候相当有用,因为它可以存储任意类型的数值。它有点类似于C语言的void*类型。 ![ ](https://upload-images.jianshu.io/upload_images/14371339-334ba3a963111a23.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 一个函数把interface{}作为参数,那么他可以接受任意类型的值作为参数,如果一个函数返回interface{},那么也 就可以返回任意类型的值。是不是很有用啊! ### 9、结构体中可以定义字段,但接口不行 structs与interfaces不能具有相同的API,因为interfaces无法定义字段。这个问题并算很大,因为可以在接口中定义getter和setter方法,虽然这有点混乱。 eg: ![ ](https://upload-images.jianshu.io/upload_images/14371339-d754463bfe0c4101.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ### 10、Public和Private命名 Golang将Python的public和private方法命名方案做了进一步发展。当我最初发现以大写字母开头的函数、结构体是public,而小写开头的则是private的时候, 感觉不可思议,但我很享受这种语法。 ``` type PublicStructName struct {} //public 外部能调用 type privateStructName struct {} // 私有 结构体,仅内部函数能调用 ``` ### 最后 今天就先到这里,golang语法很多,这里只是其中的冰山一角。如果大家想学习golang,我这里推荐:https://github.com/Unknwon/the-way-to-go_ZH_CN 阅读更多 [**31道Android面试题 ,牢固你的基础!**](http://mp.weixin.qq.com/s?__biz=MzI3OTU0MzI4MQ==&mid=2247486424&idx=1&sn=17579506f6ea8acea5044d57eb0480d0&chksm=eb476746dc30ee50a053cc3eab6d195fcb04724005fcb20d94761e8b0d2aa021ee2f0d854587&scene=21#wechat_redirect) [**做后台是选择Java 、Go ,还是 PHP?**](http://mp.weixin.qq.com/s?__biz=MzI3OTU0MzI4MQ==&mid=2247486359&idx=1&sn=64816ee1d73e06c182fc6f8ef9916f5a&chksm=eb476709dc30ee1f4b8365d95329d74936b8f0342f98047bd7e530519bcce72cca946dac7805&scene=21#wechat_redirect) [**AndroidUtils:Android开发不得不收藏的Utils**](http://mp.weixin.qq.com/s?__biz=MzI3OTU0MzI4MQ==&mid=2247486342&idx=1&sn=322b75b90299bf3a31ae5f3a5c43ac38&chksm=eb476718dc30ee0e13593c19807f0e2b5c63773deada5d3652f65a07ed5dcfb0ca3da3ec3e14&scene=21#wechat_redirect) [**美团面试题:Java-线程池 ThreadPool 专题详解**](http://mp.weixin.qq.com/s?__biz=MzI3OTU0MzI4MQ==&mid=2247486321&idx=1&sn=5833e1116181764abf1b093e9726f181&chksm=eb4767efdc30eef9dd187d2a59635661a4c8603619699194e651359f4f7a503806920d59ec19&scene=21#wechat_redirect) #### 相信自己,没有做不到的,只有想不到的 在这里获得的不仅仅是技术! ![ ](http://upload-images.jianshu.io/upload_images/14371339-69c8f94aae677c8c?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

836 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传