编译运行
代码的编译运行
go build : 产生一个可执行二进制文件
go run :
go install : 会在pkg里面产生一个.a 的库
go clean : 移除当前源码包和关联码包里面编译生成的文件
go fmt : 格式化代码格式。eg: gofmt -w -l src
go get :动态获取远程代码包
go test : 会读取源代码目录下面名为*_test.go文件,生成并运行测试用的可执行文件。
go tool :
go generate :
包结构
程序都是用package来组织;在每个go文件前面,需要先声明一下是属于哪个package;
其中package main 和 func main 是程序执行的入口。
package的名字最好能跟src目录下的结构一致
每个package的文件都有一个保留的init函数。不会返回任何值,也不能传入任何参数。go会自动调用init。
import
import 引入的路径推荐用绝对路径
-
点操作
我们有时候会看到如下的方式导入包
import(
. "fmt"
)
这个点操作的含义就是这个包导入之后在你调用这个包的函数时,你可以省略前缀的包名,也就是前面你调用的fmt.Println("hello world")可以省略的写成Println("hello world") -
别名操作
别名操作顾名思义我们可以把包命名成另一个我们用起来容易记忆的名字。别名操作的话调用包函数时前缀变成了我们的前缀,即f.Println("hello world")
import(
f "fmt"
)
- _ 操作
这个操作经常是让很多人费解的一个操作符。 _ 操作其实是引入该包,而不直接使用包里面的函数,而是调用了该包里面的init函数。请看下面这个import
import (
"database/sql"
_ "github.com/ziutek/mymysql/godrv"
)
变量
命名:
- 名字是区分大小写
- 关键字不能用来命名。
声明:
用 var (变量), const(常量) , type (定义一个新的命名类型,但是不同的命名类型都是完全不相同,就算他们underlying-type 是相同的), func (函数)。
声明的位置如果在func里面,则是本地变量。 如果在package 又不在func里,是package level。 package level 的表示在pacakge里面的,都是可见
var name type = expression
提供一个语法糖: name := expression
指针:
指向变量的地址,如果有C语言开发经验,这个很好理解。
可以使用new(T) 的方式,创建一个值为0,返回类型为 T* 的地址。
_(下划线) 是个特殊的变量名,任何赋予它的值都会被丢弃
iota枚举:声明enum的时候采用,默认开始是0, 每增一行+1
大写字母开始的变量是可导出;小写字母开头是不可导出的
数组
array
是数组类型。 格式:
var arr [n] type { }
n表示长度, type 是类型, 通过[ ] 来读取或者赋值。 { } 里面就是初始值,可以不写
slice
slice总是指向一个底层array,slice的声明也可以像array一样,只是 不需要长度。
对于slice有几个有用的内置函数:
有用的几个内置函数:
- len 获取slice的长度
- cap 获取slice的最大容量
- append 向slice里面追加一个或者多个元素,然后返回一个和slice一样类型的slice
- copy 函数copy从源slice的src中复制元素到目标dst,并且返回复制的元素的个数
map
格式为
map[keyType] valueType
声明格式
// 声明一个key是字符串,值为int的字典,这种方式的声明需要在使用之前使用make初始化
var numbers map[string] int
// 另一种map的声明方式
numbers = make(map[string] int)
基本操作
- map的初始化可以通过key:val的方式初始化值,同时map内置有判断是否存在key的方式
// map有两个返回值,第二个返回值,如果不存在key,那么ok为false,如果存在ok为true
csharpRating, ok := rating["C#"] - 通过delete删除map的元素:delete(rating, "C") // 删除key为C的元素
注意
map和其他基本型别不同,它不是thread-safe,在多个go-routine存取时,必须使用mutex lock机制
make、new操作
make用于内建类型(map、slice 和channel)的内存分配。new 用于各种类型的内存分配。
内建函数new本质上说跟其它语言中的同名函数功能一样:new(T)分配了零值填充的 T 类型的内存空间,并且返回其地址,即一个*T类型的值。用Go的术语说,它返回了一个指针,指向新分配的类型 T 的零值。有一点非常重要:
new 返回指针。
内建函数make(T, args)与new(T)有着不同的功能,make只能创建slice、map和channel,并且返回一个有初始值(非零)的 T 类型,而不是*T。本质来讲,导致这三个类型有所不同的原因是指向数据结构的引用在使用前必须被初始化。例如,一个slice,是一个包含指向数据(内部array)的指针、长度和容量的三项描述符;在这些项目被初始化之前,slice为nil。对于slice、map和channel来说,make初始化了内部的数据结构,填充适当的值。
网友评论