Golang简介(一)
===

`Go`语言`(Golang)`最初是由`Robert Griesemer`,`Rob Pike`和`Ken Thompson`在谷歌于2007年开发出来的编程语言。`Go`编程语言是静态类型语言,语法类似于`C`语言,它提供了垃圾收集,类型安全,动态的输入能力,还有很多先进的内置类型,例如,可变长度数组和映射(键-值对)。它还提供了丰富的标准库。

`Go`编程语言是一个开源项目,它使程序员更具生产力。

`Go`语言具有很强的表达能力,它简洁、清晰而高效。得益于其并发机制, 用它编写的程序能够非常有效地利用多核与联网的计算机,其新颖的类型系统则使程序结构变得灵活而模块化。`Go`代码编译成机器码不仅非常迅速,还具有方便的垃圾收集机制和强大的运行时反射机制。 它是一个快速的、静态类型的编译型语言,感觉却像动态类型的解释型语言。

`Go`编程语言是在2009年11月正式对外发布,主要是应用谷歌的于一些生产系统链中。

[Golang官网](https://golang.org/)

`Go`语言出现场景:  

- `C/C++` 的发展速度无法跟上计算机发展的脚步,十多年来也没有出现一门与时代相符的主流系统编程语言,因此人们需要一门新的系统编程语言来弥补这个空缺,尤其是在计算机信息时代。
- 对比计算机性能的提升,软件开发领域不被认为发展地足够快或者比硬件发展更加成功(有许多项目均以失败告终),同时应用程序的体积始终在不断地扩大,这就迫切地需要一门具备更高层次概念的低级语言来突破现状。
- 在`Go`语言出现之前,开发者们总是面临非常艰难的抉择,究竟是使用执行速度快但是编译速度并不理想的语言(如:`C++`),还是使用编译速度较快但执行效率不佳的语言(如:`.NET`、`Java`),或者说开发难度较低但执行速度一般的动态语言呢?显然`Go`语言在这3个条件之间做到了最佳的平衡:快速编译,高效执行,易于开发。


学习`Go`语言的第一步是先去官网上下载安装`go`:   
<img src="https://raw.githubusercontent.com/CharonChui/Pictures/master/go_download.png?raw=true" width="100%"/>

`Mac`安装版下载后双击可以看到安装界面,按照提示一步步选择操作即可。安装版默认安装目录是`/usr/local/go`,并且也会自动的把`/usr/local/go/bin`目录加入到`PATH`环境变量中,重新打开一个终端,就可以使用`go version`进行测试了,更快捷方便一些。


`Go`语言程序可以从3行到数百万行,代码可通过写入到一个或多个扩展名`.go`的文本文件。例如,`hello.go`。

下面是一个简单的`Go`入门程序,`hello_world.go`的完整代码如下所示:   
```go
package main // 声明包
import "fmt" // 导入fmt包,这里导入的是go的标准库,如果导入本地新自定义的包可用import "./struct_pack/structPack"
func main() {
    /*This is my first sample program.*/
    fmt.Println("hello world")
}
```
执行上面的代码:   
```go
$ go run hello_world.go
hello world
```

`go run`会将程序编译成二进制文件,然后执行。我们也可以分两部分进行,利用`go build`进行构建成二进制文件。  
```shell
go build hello_world.go
```
执行完成后你会发现当前目录多了一个`hello_world`文件。
我们可以直接执行该二进制文件:   
```shell
./hello_world
```
然后就会打印出`hello world`。  


`Go`程序基本上由以下部分组成:    

- 软件包声明
- 导入包
- 函数(功能)
- 变量
- 语句和表达式
- 注释


工作目录
---

工作目录就是我们用来存放开发的源代码的地方,对应的也是`Go`里的`GOPATH`这个环境变量。这个环境变量指定之后,我们编译源代码等生成的文件都会放到这个目录下.这个工作目录我们可以根据自己的设置指定,比如我的`Mac`在`user/xxx/go`下该目录下有3个子目录,他们分别是:
```
.
├── bin
├── pkg
└── src
```

- `bin`文件夹存放命名生成的可执行文件
- `pkg`文件夹是存在`go`编译生成的文件。
- `src`存放的是我们的`go`源代码,不同工程项目的代码以包名区分。


在上面的示例代码中`fmt.Println("hello world")`的`P`是大写的,这与`java`有些不同,方法不都是小写的吗? 


在`Go`语言中,如果以大写字母开头,则是导出的名称。导出意味着相应包装的输入者可以访问函数或变量/常数。
在导入包之后,只能访问包所导出的名字,任何未导出的名字是不能被包外的代码访问的。
`Foo`和`FOO`都是被导出的名称。名称`foo`是不会被导出的。
执行代码,注意编译器报的错误。
如将`math.pi`改名为`math.Pi`再试着执行一下。

[下一篇:Golang变量及函数(二)](https://github.com/CharonChui/GolangStudyNote/blob/master/2.Golang%E5%8F%98%E9%87%8F%E5%8F%8A%E5%87%BD%E6%95%B0(%E4%BA%8C).md)


---

- 邮箱 :charon.chui@gmail.com  
- Good Luck!