Go 语言基础
特点
常用命令
go run
直接运行, 不会生成可执行文件go build
生成可执行文件, 推荐
加分特点
-
UTF-8
编码 -
高并发:
go
关键字 -
管道:
pipe := make(chan int, 1)
-
在一个文件中, 大写字符开头表示对外开放, 小写字符开头则不对外开放
-
第一行代码一定以
package main
如果是一个可以运行的项目, 则一定会有main
包, 如果是其他的, 则是自定义的名字 -
所有的类都实现了空接口(
interface{}
), 相当于 Object, 耦合度很低, 可以接受, int , float, slice, map, string, struct, interface 等类型 -
默认的赋值都是值传递
-
不使用
this
, 而是通过interface
定义方法特有的形式, 简单方便, 不会有和 JS 一样的 this 歧义问题 -
没有构造函数, 通过工厂函数创建 struct
-
支持闭包, 内置 VM
程序执行流程
- 找到
package main
下的有main
函数的入口程序 - 发现
import some
, 进入到some
中 - 如果
some
中还有import
, 继续步骤 2 - 如果没有
import
了, 则初始化全局变量 - 在被
import
的函数中, 执行init
函数 - 一直返回, 直到
main
函数位置 - 执行
main
函数
目录结构
-
配置
GOPATH
环境变量, 它用来指定类似于Eclipse中的工作空间 -
GOPATH
指定的工作空间的目录结构
- workspace
+ src
+ code1
+ main
+ other_pkg
+ code2
+ bin
+ vender(第三方)
+ pkg(动态链接库)
- 我们自己定义的包, 在使用
import
导入的时候, 默认在GOPATH
下的src
下找的, 但是一般我们的代码又不是直接放在src下的, 所有import
的时候要从code1/other\_pkg
开始
- 在第2点标准目录下
go build
或者go run
命令执行cd
到workspace
目录下go build code1/main
-> 注意,main
是包名, 不需要执行文件名, 现在是在workspace
目录,code1
是在src下, 但是命令中要去掉src
目录
语法
导包
import (
"fmt"
"os"
"time"
)
const使用
const (
a = 10
b = 20
)
var使用
var (
a = 10
b = 20
)
定义变量
// 一般需要两行
var a int
a = 20
// 但是go语言为了方便提供了下面的方式, 两者是等价的, a:=20会被go编译器转为上面***两条***语句
a := 20
类型
-
int, int8, int16, int32, int64, uint8, uint16, uint32, uint64, float32, float64
-
bool
-
string
-
chan
-
map
-
slice
-
[...]
字符与字符串
- 字符使用''
- 字符串使用""或者
,
与Python中的""" """一样
两种类型
- 值类型: 整数, 字符串, 数组, 结构体
- 引用类型: slice, map, chan, 指针(和C语言中一样)
类型转换
- 类型(变量), 括号中只能是变量, 不能是字面量等常量
内置函数
len()
cap()
make()
delete()
只用于删除 map 中的元素
接口
- 实现一个
interface
type MyInterface interface {
Say()
Run()
}
反射
基本
- 获取类型
var.(type)
,type 是关键字, 返回类型, bool, int32, string 等 - var.(interfaceName)
, 是否实现了
interfaceName的接口, 而·
var`为接口变量
reflect
TypeOf
返回类型Type
ValueOf
获取包含大量反射信息的对象, 后面的 API 都是对此对象(Value
)进行操作Value.Kind
返回变量类型, 类型在reflect
包中, 如reflect.Struct
Value.Interface()
将Value
转回去Value.Int()
获取 int 值Value.Float()
获取 float 值Value.String()
获取 string 值Value.Elem()
如果 Value 是从指针转过来的, 要获得指针对应的值, 使用该方法, 类似于*ptr
Value.Set系列()
赋值Value.NumFields()
属性个数Value.NumMethods()
方法个数Value.Method(numIndex).Call(args)
调用方法
多线程
内置包
fmt
fmt.Printf()
fmt.Println()
time
time.Sleep()
time.Now().Unix()
os
os.Getenv()
os.Stdin
os.Stdout
os.Stderr
os.Args
os.OpenFile
os.Fprintf(文件句柄, content)
文件句柄来自os.OpenFile
math/rand
rand.Int()
-> 很大rand.Float32()
-> [0, 1)rand.Seed(time.Now().Unix())
encoding/json
-
json.Marshal(struct)
打包struct
中的tag
, 只能打包struct
中大写开头的 -
json.UnMarshal(struct)
bufio
reflect
1. `TypeOf`返回类型 `Type`
2. `ValueOf`获取包含大量反射信息的对象, 后面的 API 都是对此对象(`Value`)进行操作
3. `Value.Kind` 返回变量类型, 类型在 `reflect`包中
4. `Value.Interface()`将 `Value` 转回去
5. `Value.Int()`获取 int 值
6. `Value.Float() `获取 float 值
7. `Value.String()`获取 string 值
8. `Value.Elem()` 如果 Value 是从指针转过来的, 要获得指针对应的值, 使用该方法, 类似于 `*ptr`
9. `Value.Set系列()`赋值
10. `Value.NumFields()`属性个数
11. `Value.NumMethods()`方法个数
12. `Value.Method(numIndex).Call(args)`调用方法
第三方包
Beego
- 一个类似 Python 中 Flask 的 web 框架