Go是一种新的语言,一种并发的、带垃圾回收的、快速编译的语言。它具有以下特点:
- 它可以在一台计算机上用几秒钟的时间编译一个大型的Go程序。
- Go为软件构造提供了一种模型,它使依赖分析更加容易,且避免了大部分C风格include文件与库的开头。
- Go是静态类型的语言,它的类型系统没有层级。因此用户不需要在定义类型之间的关系上花费时间,这样感觉起来比典型的面向对象语言更轻量级。
- Go完全是垃圾回收型的语言,并为并发执行与通信提供了基本的支持。
- 按照其设计,Go打算为多核机器上系统软件的构造提供一种方法。
Go是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生了。
Go环境配置
本人是Windows64位操作系统,所以默认安装环境为Windows x64。
安装
进入golang官网下载页https://golang.org/dl/
下载完毕后安装默认安装路径进行安装,安装完毕后打开cmd,输入go
检验是否安装成功。
工作空间
go 命令依赖一个重要的环境变量%GOPATH%
(windows系统中的环境变量格式)。
可以看到,在该目录下,有三个子目录bin、pkg、src
。
- src 存放源代码(比如:.go .c .h .s等)
- pkg 编译后生成的文件(比如:.a)
- bin 编译后生成的可执行文件
简单的Go程序
go程序所有的源码都放在src
文件目录下,一般情况下,一个项目一个目录。也就是说,我们假设要新建一个mysum
的项目,那么就在src
文件夹下新建一个mysum
文件夹。
在src\mysum
目录下新建一个sum.go
文件用来计算a+b
的值。该文件属于应用包,所以package
的名称一般建议和目录名称保持一致,如下
package mysum
func Sum(a float64, b float64) float64{
return a+b
}
在任意路径下打开cmd输入go install mysum
进行编译安装。
编译安装完毕后,会在pck\windows_amd64
目录下出现编译好的.a
文件,即编译好的应用包。
如果我们想要调用这个应用包,就需要建立一个应用程序来进行调用。在src
目录下新建一个文件夹sumapp
,在该文件夹目录下建立一个main.go
文件,package
的名称为main
。
package main
import (
"mysum"
"fmt"
)
func main() {
fmt.Printf("%v\n", mysum.Sum(1,2))
}
在src\sumapp
目录下执行go build
命令进行编译。
然后,该目录下会生成相应的exe
文件。
执行该exe文件:sumapp
,最终得到输出结果。
小结
package <pkgName>
告诉我们当前文件属于哪个包,而包名main
则告诉我们它是一个可独立运行的包,它在编译后会产生可执行文件。除了main
包之外,其它的包最后都会生成*.a
文件(也就是包文件)并放置在$GOPATH/pkg/$GOOS_$GOARCH
中。
Go语法
变量
Go语言里面定义变量有多种方式。
使用var
关键字是Go最基本的定义变量方式,Go把变量类型放在变量名后面:
//定义一个名称为“variableName”,类型为"type"的变量
var variableName type
上述的表示确实有些繁琐,可以用:=
进行简化。:=
这个符号直接取代了var
和type
,这种形式叫做简短声明。但是这种简短声明只能用在函数内部,所以一般用var
方式定义全局变量。
vname := v1
_
(下划线)是个特殊的变量名,任何赋予它的值都会被丢弃。在下面例子中,我们将值35
赋予b
,并同时丢弃34
:
_, b := 34, 35
Go对于已声明但未使用的变量会在编译阶段报错。
常量
常量,也就是在程序编译阶段就确定下来的值,而程序在运行时无法改变该值。在Go程序中,常量可定义为数值、布尔值或字符串等类型。
它的语法如下:
const constantName = value
//如果需要,也可以明确指定常量的类型:
const Pi float32 = 3.1415926
字符串
Go的字符串是用一对双引号("")或反引号( `)括起来定义,它的类型是string
。
var s string = "hello"
在Go中字符串是不可变的,所以不能通过s[0] = 'c'
的操作改变字符串。但是我们可以把string
类型转换为[]byte
类型,然后再把[]byte
类型转换为string
类型进行字符串的更改。
c := []byte(s) // 将字符串 s 转换为 []byte 类型
c[0] = 'c'
s2 := string(c) // 再转换回 string 类型
字符串虽然不可以更改,但是可以进行切片操作:
s = "c" + s[1:] // 字符串虽不能更改,但可进行切片操作
可以通过`来声明多行字符串:
m := `hello
world`
一些规则
- 大写字母开头的变量是可导出的,也就是其它包可以读取的,是公有变量;小写字母开头的就是不可导出的,是私有变量。
- 大写字母开头的函数也是一样,相当于
class
中的带public
关键词的公有函数;小写字母开头的就是有private
关键词的私有函数。