初识Go
Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。
介绍
Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。
罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pike)及肯·汤普逊(Ken Thompson)于2007年9月开始设计Go,稍后Ian Lance Taylor、Russ Cox加入项目。Go是基于Inferno操作系统所开发的。Go于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及Mac OS X平台上进行了实现,后来追加了Windows系统下的实现。在2016年,Go被软件评价公司TIOBE 选为“TIOBE 2016 年最佳语言”。 目前,Go每半年发布一个二级版本(即从a.x升级到a.y)。
描述
Go的语法接近C语言,但对于变量的声明有所不同。Go支持垃圾回收功能。Go的并行模型是以东尼·霍尔的通信顺序进程(CSP)为基础,采取类似模型的其他语言包括Occam和Limbo,但它也具有Pi运算的特征,比如通道传输。在1.8版本中开放插件(Plugin)的支持,这意味着现在能从Go中动态加载部分函数。
与C++相比,Go并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能,但增加了 切片(Slice) 型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持。Go 2.0版本将支持泛型,对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。
不同于Java,Go内嵌了关联数组(也称为哈希表(Hashes)或字典(Dictionaries)),就像字符串类型一样。
编写风格(重点)
左花括号不能放在单独一行
Go语言很可能是第一个将代码风格强制统一的语言,例如Go语言要求public的变量必须以大写字母开头,private变量则以小写字母开头,这种做法不仅免除了public、private关键字,更重要的是统一了命名风格。
另外,Go语言对{ }应该怎么写进行了强制,写法如下表:
正确编写 | 错误编写 |
package main import "fmt" func main(){ fmt.Println("Hello World!") } | package main import "fmt" func main() { //error fmt.Println("Hello World!") } |
而C和Java语言中则对花括号的位置没有任何要求。哪种更有利,这个见仁见智。但很显然的是,所有的Go代码的花括号位置肯定是非常统一的。
未使用的变量
正确编写 | 错误编写 |
package main import "fmt" func main(){ var i int i = 9 fmt.Print(i) } | package main import "fmt" func main(){ var i int var j int //error i = 9 fmt.Print(i) } |
变量声明
Go语言的变量声明方式与C和C++语言有明显的不同。对于纯粹的变量声明,Go语言引入了关键字var,而类型信息放在变量名之后,实例如下:
var v1 int var v2 string var v3 [10]int //数组 var v4 []int //数组切片 var v5 struct{ f int } var v6 *int //指针 var v7 map[string]int //map,key为string常量,value为int类型 var v8 func(a int) int
变量声明语句不需要使用分号作为结束符。与C语言相比,Go语言抛弃了语句必须以分号作为语句结束标记的习惯。
var关键字的另一种用法是可以将若干个需要声明的变量放置在一起,避免重复写var关键字,如下所示:
var{ v1 int v2 string }
变量初始化
对于声明变量时需要初始化的场景,var关键字可以保留,但不再是必要的元素,如下所示:
var v1 int = 10 var v2 = 10 v3 := 10
以上三种用法的效果是完全一样的。与第一种用法相比,第三种用法需要输入的字符数大大减少,是偷懒的最佳选择。这里Go语言也引入了另一个C和C++中没有的符号(冒号和等号的组合:=),用于明确表达同时进行变量声明和初始化的工作。(出现在:=左侧的变量不应该是被声明过的,否则会导致编译错误)
变量赋值
Go语言的变量赋值与多数语言一致,但Go语言中提供了多重赋值功能,比如下面这个交换i和j变量的语句:
i , j = j , i
在不支持多重赋值的语句中,交互两个变量的内容需要引入一个中间变量:
t = i ; i = j ; j = t;
匿名变量
假设GetName( )函数的定义如下,它返回3个值,分别为firstName、lastName和nickName:
func GetName() (firstName, lastName, nickName string){ return "Mary","Chan","Tian Ku" }
若只想获得nickName,则函数调用语句可以用如下方式编写:
_, _, nickName := GetName() //注意变量先申明后使用
未使用的包(import)
正确编写 | 错误编写 |
package main import "fmt" func main(){ i := 9 j := 0 i , j = j , i fmt.Println(i+j) } | package main import "fmt" //error func main(){ i := 9 j := 0 i , j = j , i } |
简式变量的声明仅可在函数内部使用
正确编写 | 错误编写 |
package main import "fmt" func main(){ i := 9 fmt.Println(i) } | package main import "fmt" i := 9 //error func main(){ fmt.Println(i) } |
使用简式变量重复声明变量
你不能在一个单独的声明中重复声明一个变量,但在多变量声明中这是允许的,其中至少要有一个新的声明变量。
重复变量需要在相同的代码块内,否则你将得到一个隐藏变量。
正确编写 | 错误编写 |
package main import "fmt" func main() { v1 := 0 v1, v2 := 1,2 fmt.Print(v1+v2) } | package main import "fmt" func main() { v1 := 0 v1 := 1 //error fmt.Print(v1) } |
偶然的变量隐藏
短式变量声明的语法如此的方便(尤其对于那些使用过动态语言的开发者而言),很容易让人把它当成一个正常的分配操作。如果你在一个新的代码块中犯了这个错误,将不会出现编译错误,但你的应用将不会做你所期望的事情。
package main import "fmt" func main() { v1 := 0 fmt.Println(v1)//0 { fmt.Println(v1)//0 v1 := 1 fmt.Println(v1)//1 } fmt.Println(v1)//0 }
写在最后
以上就是对Golang的基本介绍了,暂时先写这么多,后面也会进行完善。
你知道的越多,你不知道的就越多,人才们的 【三连】 就是我创作的最大动力,我们下期见!
注:如果本篇博客有任何错误和建议,欢迎人才们留言,你快说句话啊!
参考: