Java与Go不同点
Go自增语句:自增语句i++
给i
加1;这和i += 1
以及i = i + 1
都是等价的。对应的还有i--
给i
减1。它们是语句,而不像C系的其它语言那样是表达式。所以j = i++
非法,而且++和--都只能放在变量名后面,因此--i
也非法。
Go访问权限:如果一个名字是在函数内部定义,那么它就只在函数内部有效。如果是在函数外部定义,那么将在当前包的所有文件中都可以访问。名字的开头字母的大小写决定了名字在包外的可见性。如果一个名字是大写字母开头的(译注:必须是在函数外部定义的包级名字;包级函数名本身也是包级名字),那么它将是导出的,也就是说可以被外部的包访问,例如fmt包的Printf函数就是导出的,可以在fmt包外部访问。包本身的名字一般总是用小写字母。
Go的知识点:
counts := make(map[string]int)
map
是一个由make
函数创建的数据结构的引用。map
作为参数传递给某函数时,该函数接收这个引用的一份拷贝(copy,或译为副本),被调用函数对map
底层数据结构的任何修改,调用者函数都可以通过持有的map
引用看到。
指针:Go语言指针是可见的内存地址,&操作符可以返回一个变量的内存地址,并且*操作符可以获取指针指向的变量内容,但是在Go语言里没有指针运算,也就是不能像c语言里可以对指针进行加或减操作。
Go 高效写法:
拼接切片(类似StringUtils.join):
strings.Join(os.Args[1:], " ")
常量做枚举:
const (
Unknown = 0
Female = 1
Male = 2
)
数组长度不确定:
var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
指针与引用:
指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。
引用的底层是指针实现:引用传递,只是明面上,没有使用值传递,值传递本身是不可避免的。编译器,暗地里通过指针(或者其他可以替代指针的数据类型)的值传递,替换了引用传递。
所以引用传递,实质上是地址传递,别名这东西只是概念,是一种抽象,别名是没法传递的。别名,可不是真实的数据类型。因为,函数传递参数需要,数据复制,所以明的暗的值传递,不可避免。引用的高效,在于对大的数据,不用直接的复制数据。
切片与数组:
Go 语言切片是对数组的抽象。Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
切片(slice)是对数组一个连续片段的引用,所以切片是一个引用类型(因此更类似于 C++ 中的 Vector 类型,或者 Python 中的 list 类型)。这个片段可以是整个数组,或者是由起始和终止索引标识的一些项的子集。需要注意的是,终止索引标识的项不包括在切片内。切片提供了一个与指向数组的动态窗口。
注意:切片扩容是创建新的切片。
与java相比,非常类似。都是多申请空间,然后在空间内截取。go可能存在多个切片共用一个数组情况。由于截取的段落不一样,go是两个切片。
go扩容复杂些:
当需要的容量超过原切片容量的两倍时,会使用需要的容量作为新容量。
当原切片长度小于1024时,新切片的容量会直接翻倍。而当原切片的容量大于等于1024时,会反复地增加25%,直到新容量超过所需要的容量。
Map实现:
Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。
/* 使用 make 函数 */
map_variable := make(map[key_data_type]value_data_type)
与Java不同点:go是数组+链表+溢出桶。查询采用hashTop方式。扩容采用新旧桶分批次扩容。有点类似于redis。比Java扩容简单。
并发:
Go 语言支持并发,我们只需要通过 go 关键字来开启 goroutine 即可。goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。
通道(channel)是用来传递数据的一个数据结构。通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。操作符 <-
用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。
通道类似于Java中的future。
tips:
Go语言编程大多数情况下就是用已有的package来写我们自己的代码
go语言学习地址:https://www.zhihu.com/question/30461290
附录:
切片与数组:https://halfrost.com/go_slice/
hashmap:https://www.jianshu.com/p/aa0d4808cbb8、https://segmentfault.com/a/1190000039101378
常见优秀的第三方包:https://www.jianshu.com/p/94ccafe2a982、https://ld246.com/article/1541035788669