Go 语言基础
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返回类型TypeValueOf获取包含大量反射信息的对象, 后面的 API 都是对此对象(Value)进行操作Value.Kind返回变量类型, 类型在reflect包中, 如reflect.StructValue.Interface()将Value转回去Value.Int()获取 int 值Value.Float()获取 float 值Value.String()获取 string 值Value.Elem()如果 Value 是从指针转过来的, 要获得指针对应的值, 使用该方法, 类似于*ptrValue.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.Stdinos.Stdoutos.Stderros.Argsos.OpenFileos.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 框架

浙公网安备 33010602011771号