写在前面
Go是一个开源的编程语言,比较令人熟知的就是其简易性和高效性,在保证运行效率高的同时又有比较好的开发效率。Go具有简洁、快速、并行、安全等语言特性,并且其还具有内存管理,真正做到了精简且强大。Go的官网为golang.google.cn/ ,在官网有很多学习资料用来学习参考。
一个简单的程序
我们用一下一个十分简单的hello world程序来对go的基本程序结构进行了解
package main
import "fmt"
func main() {
fmt.Println("hello,world")
}
- 首先通过package指定包名,每一个包都会包含若干个.go文件,这个结构与java中包的概念比较类似。
- 然后import则用来引用其他模块,既可以引用标准库中的模块,也可以引用第三方模块以及其他包下的模块,这点 与java中的import是比较相像的。
- 接下来就是主程序,main函数,纵观整个程序,可以发现整个go程序既包含了包、import等比较类似java的地方,又没有像java一样万物皆对象,相反整个程序结构又有一些像c++的结构。
Go数据类型
- bool类型,关键字为bool,有true和false两个属性
- 数值类型,包括int,float32,float64,比较常见
- 字符串类型,关键字为string,比较常见
- 指针、数组、结构体、接口、channel、map等类型,用途很多
Go基本语法
- 选择结构
- 像其他大多数编程语言一样,Go提供了选择语法,包括if,if..else...,switch,select
- 对于if结构,保守一点可以像c++一样写,但go的if明显是比c++的要更加灵活一些的,比如下面的程序
看起来很匪夷所思的if程序,但是在Go中是可以的。func main() { if a := 10; a > 5 { fmt.Println("above") } else if a := 20; a < 5 { fmt.Println("below") } } - 循环结构
- Go中自然也是有循环结构的,同时Go的循环结构也是相当灵活,我们可以在Go中用foreach类型的结构来便利整个容器中所有的元素,对于切片或者数组结构,Go甚至还贴心的给出对应的下标,十分方便。
- Go中的for同时兼具了C++中for循环和while循环的角色,并且写起来很方便,比如
连括号都不用,写起来很舒适。s := 1 for s < 10 { s = s + 1 } - 函数
- Go中的函数形式为 func funcName(parameters) return types {}
- Go中函数的返回值是可以有多个的,并且天然这些返回值是可以为不同类型的,对于同时返回多个不同类型返回值得场景简直极大提高了编程舒适度
- 结构体
- Go中的结构体是Go面向对象的主要手段,定义格式为type StructName struct {varable type}
- 可以提供结构体成员函数,成员函数可以有两种形式,一种是指针类型,一种为非指针类型,区别是前者可以改变调用者的成员变量,后者不可以
- 下面这个程序定义了一个简单的User结构并实现了set和get方法。
type User struct { id int name string } func (user User) getName() string { return user.name } func (user *User) setName(newName string) { user.name = newName } func (user User) outName() { fmt.Println(user.name) } - Map
- Go中的Map是无序的键值对集合,由于Map是无序的,因此便利Map返回的键值对顺序是不确定的。Go中的Map可以类比Java中的HashMap,C++中的unordered_map
- 定义Map,只需要为
- map_var := make(map[keytype]valtype,iniCapacity)
- 其中iniCapacity是可选的
- 可以直接通过[key]的方式获取对应的value
- 可以通过foreach的方式遍历Map
- for k,v := range map_var{...}
Go常用特性
- 垃圾回收
- 世界上有两种编程语言,一种是有垃圾回收的,一种是没有垃圾回收的。Go语言是带有垃圾回收机制的,因此编程人员可以将更多的精力放在功能开发上。
- 并发编程
- goroutine是轻量级线程,其调度是Golang运行时进行管理的,其使用也是非常简单
- goroutine使用语法格式为 go 函数名(参数)
- 可以通过channel进行goroutine的协调与通信
- channel可以是带缓存的,也可以是不带缓存的
- 比如下面这个简单的程序就可以随机交替打印123十分方便
func print(x int) { for i := 0; i < 100; i++ { fmt.Println(x) time.Sleep(time.Second) } } func main() { go print(1) go print(2) go print(3) time.Sleep(time.Second * 100) } - 多返回值
- Go函数是支持多返回值的,可以在同一个函数返回多个不同类型的值,其中比较重要的一个特性是返回error,即同时返回函数结果和error
- Defer
- Go是支持延迟处理的,通过defer xx.close()可以用于资源的关闭,即放置error发生时忘记关闭资源等情况,保证了程序的简洁性,是一种十分优雅的处理方式。
总结
Go是一门十分现代化的语言,具有简洁、高效等特点,是比较值得学习的,可以通过官方文档以及相关博客对Go进行更加深入的了解。