本文整合了 Golang 的基础知识体系,包括基础语法规范、包管理(
package与import) 以及特有的指针概念,适合 Go 语言初学者参考。
1. 简介
简介
GO 语言特点
- 运行效率高,开发高效,部署简单 (可直接编译成机器码,不依赖其他库,glibc的版本有一定要求,部署就是扔一个文件上去就完成了)
- 语言层面支持并发,易于利用多核实现并发 (最大特点)
- 内置
runtime(作用:性能监控,GC等),支持垃圾回收 - 丰富标准库,强大网络库
- 内置强大的工具(
gofmt),跨平台编译,内嵌C支持
GO 语言的应用
- 服务器编程,以前你如果使用
C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。 - 分布式系统,数据库代理器等
- 网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用、
- 内存数据库,前一段时间
google开发的groupcache,couchbase的部分组建 - 云平台,目前国外很多云平台在采用
Go开发,CloudFoundy的部分组建,前VMare的技术总监自己出来搞的apcera云平台。
GO 语言命令行工具
go build用于编译源码文件,代码包,依赖包;go run可以编译并运行Go源码文件go get主要用来动态获取远程代码包
编译 windows x86_64 GOOS=windows GOARCH=amd64 go build hello.go
GO 安装
使用 linux1
2
3
4
5
6
7
8
9
10
11
12
13
14cd /usr/src
wget https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz
tar -xvf go*.linux-amd64.tar.gz -C /usr/local/
cat > /etc/profile.d/go_env.sh < EOF
export GOROOT="/usr/local/go"
export GOPATH=$HOME/go
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOBIN
EOF
source /etc/profile
go version
go env
一些配置
1 | go env -w GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy/,direct |
2. 基础语法
一般结构
1 | // 当前程序的包名 |
变量
1 | package main |
3. 规范
变量
声明,初始化,赋值
- 同一行声明多个变量并赋值: var a,b,c int =1,2,3 或者 d,e := 4,5
- 全局变量声明必须使用
var关键字,局部变量可以省略(a,b,c int =1,2,3) - 变量
_表示丢弃变量类型转换
- 类型转换必须是显示的,不存在隐式转换
- 只发生在兼容类型之间
- <变量名称> [:]= <目标类型>(<需要转换的变量>)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15package main
import (
"fmt"
"reflect"
)
func main(){
var a float32 = 3.1
c := int(a)
fmt.Println(c)
fmt.Println(reflect.TypeOf(c))
}
变量可见性规则
- 大写字母开头的变量可导出,其他包可以读取,是共有变量
- 小写字母开头的变量不可导出,是私有变量
常量
常量定义形式
常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型
- 显示 const identifier [type] = value
- 隐式 const identifier = value (通常叫做 无类型常量)
- 常量可以使用 内置表达式定义 eg:
len(),unsafe.Size0f()等
特殊常量 iota
- iota 在 const 关键字出现时被重置为 0
- const 中每新增一行常量声明 iota 就计数一次
- iota 只能在常量中使用
iota 常见使用法:
- 跳值使用法
- 插队使用法
- 表达式隐式使用法
- 单行使用法
4. package与import
package
package是最基本的分发单位 和 工程管理中依赖关系的体现- 每个
GO语言源代码文件开头 都拥有一个package声明,表示源代码所属的代码包 - 要生成
GO语言可执行程序,必须要有main的package包,且必须在该包下 有main()函数 - 同一个路径下(文件夹) 只能存在 一个
package, 一个package可以拆分为多个源文件组成
import 导入包的几种方式:点,别名与下划线
在写 Go 代码的时候经常用到 import 这个命令用来导入包文件,看到的方式参考如下:1
2
3import(
"fmt"
)
然后在代码里面可以通过如下的方式调用fmt.Println("hello world")
上面这个fmt是Go语言的标准库,他其实是去 GOROOT 下去加载该模块,当然 Go 的 import 还支持如下两种方式来加载自己写的模块:
相对路径 import "./model" // 当前文件同一目录的 model 目录,但是不建议这种方式 import
绝对路径 import "shorturl/model" // 加载GOPATH/src/shorturl/model模块
三种导入包的使用方法。
点操作
import( . "fmt" )
可以省略前缀的包名,fmt.Println("hello world")可以省略的写成Println("hello world")别名操作
import( f "fmt" )调用包函数时前缀变成了重命名的前缀,即f.Println("hello world")_ 操作
import ( "database/sql" _ "github.com/ziutek/mymysql/godrv" )
_ 操作其实只是引入该包。即使用 _ 操作引用包是无法通过包名来调用包中的导出函数,而是只是为了简单的调用其 init 函数()
5. 指针
变量是一种使用方便的占位符,用于引用计算机内存地址。
Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址
1 | package main |
指针声明 : var var_name *var-type eg: var fp *float32
1 | package main |
空指针 :当一个指针被定义后没有分配到任何变量时,它的值为 nil1
2
3
4
5
6
7
8
9package main
import "fmt"
func main() {
var ptr *int
var ptr1 *
fmt.Printf("ptr 的值为 : %x\n", ptr ) /* 0 */
}