Go 基本介绍
Go发展
早在2007年9月,Go语言还是这帮大牛的20%自由时间的实验项目。 幸运的是, 到了2008年5月 , Google发现了Go语言的巨大潜力, 从而开始全力支持这个项目 , 让这批人可以全身心投入Go语言的设计和开发工作中。 Go语言的第一个版本在2009年11月正式对外发布,并在此后的两年内快速迭代,发展迅猛。 第一个正式版本的Go语言于2012年3月28 日正式发布, 让Go语言迎来了第一个引人瞩目的里程碑。截至现在,Go已经更新到1.5版本,1.5正式版就在8月份中旬发布。
Go编程语言是一个使得程序员更加有效率的开源项目。Go 是有表达力、简洁、清晰和有效率的。它的并行机制使其很容易编写多核和网络应用,而新奇的类型系统允许构建有弹性 的模块化程序。Go 编译到机器码非常快速,同时具有便利的垃圾回收和强大的运行时反射。它是快速的、静态类型编译语言,但是感觉上是动态类型的,解释型语言。
Go语言最主要的特性:
- 自动垃圾回收
- 更丰富的内置类型
- 函数多返回值
- 错误处理
- 匿名函数和闭包
- 类型和接口
- 并发编程
- 反射
- 语言交互性
开发环境配置
请参见另一篇博客Golang 环境搭建
下面切入正题,介绍Go语言编程,由于只是本篇只是一个快速了解Go,所以有些内容会略微一提,如果读者用到或者要深入了解,可自行找文档参考,这里有个印象即可。
Go 编程基础
基础数据类型
- 布尔类型:
bool
- 整数类型:
int8
uint8
int16
uint16
int32
uint32
int64
uint64
int
rune
byte
complex128
complex64
,其中,byte
是int8
的别名 - 浮点类型:
float32
float64
- 字符串类型:
string
- 字符类型:
rune
,是int32
的别名 - 空:
nil
- 万能类型:
interface{}
操作符
+
&
+=
&=
&&
==
!=
(
)
-
|
-=
|=
||
<
<=
[
]
*
^
*=
^=
<-
>
>=
{
}
/
<<
/=
<<=
++
=
:=
,
;
%
>>
%=
>>=
--
!
...
.
:
&^
&^=
->
内置函数
-
len
:计算(字符串,数组或者切片,map)长度 -
cap
:计算(数组或者切片,map)容量 -
close
:关闭通道 -
append
:追加内容到切片 -
copy
:拷贝数组/切片内容到另一个数组/切片 -
delete
:用于删除map的元素
变量的定义和赋值
先定义,后赋值。变量的定义要用
var
关键字声明,如,var str string
,这就定义了一个名字为“str”的string
类型的变量;(有过其他编程语言经验的读者可能会有点不适应,不过没错,Go的变量类型就是放在变量后面的。)还可以一次定义多个变量,如var a string, b int
;这样就同时定义了一个字符串类型和一个int类型的变量;如果几个连续的变量是同样的类型,可以一次性在最后该类型变量后说明,不需要单个说明。var a, b, c string, int d
。也可以多行分别定义,如:var a string var b string var c int
这种写法要重复写var
这个关键字,其实这种写法是可以只写一个var
的,等价于下面的写法:
``` go
var (
a, b string
c int
)
```
- 变量的赋值
var a string
,定义一个string
类型的a
变量,然后a = "this is a string"
就可以把字符串的值赋给a了。这里有个简便的写法,就是声明和赋值同时进行,以上两句等同于var a string = "this is a string"
,这种写法大多数语言都是类似的.由于Go可以根据变量的值自动推断该变量的数据类型,所以还等价于var a = "this is a string"
;另外Go中还有个更为简洁的写法,等同于a := "this is a string"
,直接省略关键字var
,取而代之的是一个操作符:=
,这个操作符的作用就是声明并赋值。 - 常量的定义和赋值
常量用关键词const
说明,并且常量的值是在定义的时候一次性赋值的,如定义一个字符串常量,const CONST_STR = "const string"
等价于const CONST_STR string = "const string"
。 - *注意
const
,var
和:=
不可同时使用。
函数
函数的结构如下 func func_name([param_name type][...]) [return_value type[...]]
。
以关键字func
开头, 后面是函数名, 函数名后面是函数参数,参数个数大于等于0个,参数后面是返回值,返回值个数>=0,也就是说,Go语言支持多返回值。
其中go中有个特殊的函数(其实还有一个init函数,但是作为入门篇,不在这里介绍了),那就是main函数,main函数是无参,无返回值,名字是main的一个特殊函数,它是程序的入口,并且main函数只能定义在mian的包(下面有介绍)中。
包
如果您是Java开发者,想必对包的概念并不陌生。在Go语言中,如果开发中有来自不同库的同名的函数,该如何处理,这就要依靠package来区分,也就是说包的作用类似于作用于,是对函数,变量等作用范围的一种约束。
包的定义
包的定义是通过 package
这个关键字来说明的,一般写在文件的最上方。如package a
,则定义了一个名字为a的包。包的名字只允许有一级目录,即不允许类似java的com.example.a
或者com/example/a
这样的多层级定义。一般来说,包的名字最好和其父目录的名字一致,这样在使用包和包里的内容时会比较容易理解(另会有文章说明)。
包的使用
包的导入使用关键字import
来声明,如要在其他包中导入上面定义的包a
,则声明如下:import "a"
,如果多个,可以类似定义变量:
import (
"a"
"b"
)
函数和变量(常量)导出规则
Go语言中,抛弃了类似C++和Java中的private,public,protected,或者是friendld的可见性定义,采取了极简方式。如果变量或者函数首字母大写,代表可以导出,即对其他包是可见的,否则是不可见的。
到这里,Go的基本概念已经基本讲清楚,下面用一个示例说明上面的概念。
创建一个文件夹,名字假设叫做
example
。进入example,创建文件
main.go
,并添加以下内容:package main //因为这里有程序的入口,main方法存在,所以包名必须命名为main // 这里导入要使用的包 import ( "./number" //这里导入我们自己定义的包,“./”是说用相对路径的方式导入包 "fmt" //fmt是go标准包,用于处理输入输出 ) //这是程序的主函数,写法就是这样固定的,无参,无返回值 func main() { //调用我们的函数并把产生的结果赋值给定义的max和min变量,根据GetMaxAndMin的返回值类型,go自动推断出max和min的是int类型 max, min := number.GetMaxAndMin(1, 3, 4, 2, 6, 0, 8) //调用格式话输出打印max和min fmt.Printf("max:%v, min:%v\n", max, min) }
创建文件
numbner.go
,并添加如下内容:// 这里可以添加注释,这是单行注释 /* 这里也是注释, 是多行注释, 允许注释跨行 */ package number// 这是包名,除了文件的注释,一般包名要放在最上方 // 这里定义一个函数,用来获取values参数中的最大值和最小值。 // 函数名GetMaxAndMin大写代表其他包可见,如果是小写,则其他包不可引用该函数 // (a, b int, values ...int),a,b, values都是该函的参数,a,b是必填的参数, // ...代表values是变参,即长度不固定,个数>=0,并且都是int类型 // (int, int)代表该函数有两个返回值,都是int类型 func GetMaxAndMin(a, b int, values ...int) (int, int) { max, min := a, a //定义并赋值两个变量 max,min,并把a的值赋给max和min if a<b { //go允许简单条件和控制语句之间不加小括号,并且大括号左部分必须和条件在同一行 max = b } else { min = b } // 这里是for循环,在go中for是非常给力的循环控制器,没有其他方式(不推荐用goto) // _ 的作用是说把遍历values产生的下标的值忽略掉,v是产生的values的值, // range 关键词 用来配合for,构成一个简单的循环结构,相当于for-each // 关于 “_”,因为go中不允许有多余的为使用的参数和为使用的包,所以“_”就充当了一个垃圾桶的角色,多返回值产生的不必要值可以填入“_”, // 从而达到控制编译器编译过程中不会报错。 for _, v := range values { if v>a { max = v } if v<b { min = v } } return max, min }
注意,文件保存编码是utf-8 。
打开终端(命令行工具),切换到example目录下,执行go run main.go
,可以看到有内容输出:
max:8, min:0