博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
体验go语言的风骚式编程
阅读量:6070 次
发布时间:2019-06-20

本文共 3540 字,大约阅读时间需要 11 分钟。

最近想搞搞后台开发,话说注意力就转移到了公司用的golang。用Go做微服务比较方便,或许是因为golang强悍的语法吧,看到go的语法,自己已被深深的吸引。

来我们一起感受下Go的风骚式的代码风格。

1、魔鬼式变量声明

2、数组的声明

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 地址的指针 ptrslice 的长度 len 和容量 cap

其中 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复制代码

示例代码

4、map的声明

注意由于go语言是一个强类型的语言,因此hashmap也是有类型的,具体体现在key和value都必须指定类型,比如声明一个key为string,value也是string的map, 需要这样做

go语言中的枚举

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中的结构体和继承

7、 golang中的接口

8、 golang中的空interface

类似于java中的object,空interface(interface{})不包含任何的method,正因为如此,所有的类型都实现了空interface。空interface对于 描述起不到任何的作用(因为它不包含任何的method),但是空interface在我们需要存储任意类型的数值的时候相当有用,因为它可以存储任意类型的数值。它有点类似于C语言的void*类型。

一个函数把interface{}作为参数,那么他可以接受任意类型的值作为参数,如果一个函数返回interface{},那么也 就可以返回任意类型的值。是不是很有用啊!

9、结构体中可以定义字段,但接口不行

structs与interfaces不能具有相同的API,因为interfaces无法定义字段。这个问题并算很大,因为可以在接口中定义getter和setter方法,虽然这有点混乱。 eg:

10、Public和Private命名

Golang将Python的public和private方法命名方案做了进一步发展。当我最初发现以大写字母开头的函数、结构体是public,而小写开头的则是private的时候, 感觉不可思议,但我很享受这种语法。

type PublicStructName struct {} //public 外部能调用type privateStructName struct {} // 私有 结构体,仅内部函数能调用复制代码

最后

今天就先到这里,golang语法很多,这里只是其中的冰山一角。如果大家想学习golang,我这里推荐:

阅读更多

相信自己,没有做不到的,只有想不到的

在这里获得的不仅仅是技术!

转载地址:http://jnfgx.baihongyu.com/

你可能感兴趣的文章
Mobiscroll 三级联动地区选择
查看>>
使用kubeadm部署k8s集群00-缓存gcr.io镜像
查看>>
策略模式Strategy (分离算法,选择实现)
查看>>
Server 2012私有云之高可用——”瑞友杯”虚拟化征文
查看>>
django新建支持中文mysql数据库
查看>>
html之marquee详解
查看>>
十个糟糕的程序员的行为
查看>>
《淘宝技术这十年》笔记 (大图,手机勿入)
查看>>
Java中日期转换问题
查看>>
我的友情链接
查看>>
事件捕获/事件冒泡
查看>>
Android中通过typeface设置字体
查看>>
httpd主配置文档的介绍及小练习
查看>>
Centos 7.1 快速搭建postfix邮件系统
查看>>
学 Win32 汇编[32] - 子程序进阶
查看>>
WinAPI: GetSystemDirectory - 返回 System 文件夹路径
查看>>
C#学习笔记(20140911)-下拉框、日历、pannel控件的使用
查看>>
音乐荷包蛋 2013
查看>>
命令行模式下快速移动光标快捷键
查看>>
RxJava 入门
查看>>