28

体验golang语言的风骚编程

 5 years ago
source link: https://studygolang.com/articles/15359?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

最近想搞搞后台开发,话说注意力就转移到了公司用的golang。用Go做微服务比较方便,或许是因为golang强悍的语法吧,看到go的语法,自己已被深深的吸引。关于学习后台如何选择可以参考《 做后台是选择Java 、Go ,还是 PHP?》

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

1、魔鬼式变量声明

rUBNfyR.png!web

2、数组的声明

7fAz22Q.png!web

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

rqqeYfN.png!web

aYFRb2E.png!web

其中 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

示例代码

uMzERrM.png!web

4、map的声明

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

ArqyiiN.png!web

go语言中的枚举 iyQrAfq.png!web

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

EbE7BzN.png!web

7、 golang中的接口

YZrua2I.png!web

8、 golang中的空interface

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

Z3eM3y3.png!web

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

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

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

mEZjAza.png!web

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面试题 ,牢固你的基础!

做后台是选择Java 、Go ,还是 PHP?

AndroidUtils:Android开发不得不收藏的Utils

美团面试题:Java-线程池 ThreadPool 专题详解

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

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

nUbY7f7.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK