最近在公司实习,项目中需要用到 Golang,所以花一些时间来自学一下。因为以前有 C/C++ 基础,所以学起来不是太吃力。现将学习的语法简单记录如下,如果要深究详细的语法细节,请参考相关的 Go 语言书籍:
package main
引入包:相当于C中的include,需要包含一些库,常见的是标准输入输出相关的库fmt:import "fmt"
函数:所有编程语言中都有函数的概念,为完成某一功能的一段代码的集合。Go中的函数写法如下:
func Add(x,y int)(res int,err error){
res=x+y
return res,err
}
如以上所示,函数可以返回多个返回值(res和err)。
var a int :=10
var表示这是一个变量,int为变量类型,而变量名称放在var和类型中间。
值得注意的是,Go语言中没有private,protected,public,static等关键字,所以用变量的大小写来控制变量的可见性。如果变量名或函数名的第一个字母是大写,则该变量在外部包中可见,否则不可见。
可以使用一个形如a:=10
的语句来定义一个变量,称为初始化声明,编译器会自动推断a是一个变量,且类型为int。
语句 & 表达式
注释:注释和C/C++并无二致。
运行:写好代码并检查无误后,可以用go run test.go
命令来运行,也可以用go build
先编译,再执行。
Go语言中的数据类型有如下几种:
布尔型:其值可取true或者false,代表真和假
数字类型:包括整数,浮点数和复数类型
字符串类型:由单个字符组成的字符序列,采用Unicode编码,因此可在字符串中使用中文等非ASCII字符。
派生类型:包括以下几种:
* 指针
* 数组
* 结构体
* 联合体
* 函数
* 切片
* 接口
* Map类型
* Channel类型
常量即在程序运行时不会被修改的量,它也有类型,但只能是布尔型,数字型和字符串型。
可以通过const关键字给常量一个名称,比如const a int = 10
,其中int可以省略,编译器会自动推导。
常量还可以用作枚举,如下:
const (
one=1
two=2
three=3
}
Go语言的运算符和C/C++中基本保持一致,只有按位取反运算符不是~
而是^
Go语言的条件语句有if,else,switch,select
,重点说说switch和select。
switch格式和C/C++一致,但Go中每次case执行完成后,即使没有break,也不会顺序执行下一条,除非显式指定。
case后面的值也不限定在整数范围之内,可以是任意类型。并且可以同时测定多个值,如下:
var str string = "Hello world"
var a int = 10
switch {
case str == "Hello world", a == 10:
fmt.Println("hello world!")
case str == "smart", a == 10:
fmt.Println("smart!")
}
select类似于用于通信的switch语句,每个case必须是一个通信操作,要么发送要么接收。select随机执行一个可执行的case,如果没有case可执行,select将阻塞,直到有case可执行。
循环语句
Go语言只提供了for循环语句,没有C/C++中的while或者do...while循环。
对比一下C/C++和Go中死循环的写法,Go显得简洁而优雅:
函数
函数的语法已经在上面写过,要注意的是,函数的参数传递有两种形式:值传递和引用传递。在Go中,数组也是作为值传递的。
数组
声明一个含有10个元素的整形数组的语句如下:
var arr [10] int
声明一个含有10个元素的整形数组并初始化的语句如下:
var arr [10] int = [10] int {1,2,3,4,5,6,7,8,9,0}
指针
一个指向整形空间的指针的声明如下:
var ptr *int
通过定义一个不指定大小的数组来定义切片并初始化:
var slice1 []int=[]int{1,2,3}
或者使用make函数来创建切片:
var slice2 []int=make([]int,3,10)
这表明定义一个容量为10的切片,其中存储了3个有效元素。
len()函数返回切片的有效数据个数,cap()函数返回切片的容量,append()函数向切片追加元素,copy()函数将一个切片中的数据拷贝到另一个中去。
切片可类比C++STL中的vector来使用。
range关键字用来在for循环中遍历一个数组,切片,map,字符串等。它每次返回两个值,第一个是当前的索引,第二个是该索引对应的值。
map
Go语言中的map相当于一个语言层面的key-value的容器,底层使用哈希表来实现。可以如下创建一个key为int类型,value为string类型的map:
var a map[int]string
或
var a=make(map[int]string)
在map中添加元素:
a[10]="hello world"
删除元素:
delete(a,10)
接口相当于C++中的抽象类。