go(十)go反射和网络编程
反射反射使用的库函数为 reflect 其中reflect 中定义了多个类型 12345678910111213141516171819202122232425262728293031const ( Invalid Kind = iota Bool Int Int8 Int16 Int32 Int64 Uint Uint8 Uint16 Uint32 Uint64 Uintptr Float32 Float64 Complex64 Complex128 Array Chan Func Interface Map Pointer Slice String Struct UnsafePointer) 获取变量的值和类型主要使用2个函数 1func TypeOf(i interface{}) Type 可以通过 reflect.TypeOf 获取任意类型的 Type 类型. 通过 reflect.ValueOf 得到一个值的类型, 1func ValueOf(i interface{}) Value Value 可以通过调用 Int() flo ...
go(九)go测试和json解析支持
JSON解析内置的json解析主要通过FiledTag 来标识json的key 123456789101112131415161718192021222324252627type UserInfo struct { Name string `json:"name"` Age int `json:"age"` Likes []string `json:"likes"`}func TestJson(t *testing.T) { u := UserInfo{Name:"张三",Age: 10} like := make([]string,0,2) like = append(like,"看书") like = append(like,"打球") u.Likes = like t.Log("<====================>") //序列化 js, _err := json.Mars ...
go(八)go协程并发和通道
协程和通道在go 中使用比线程更加轻量的协程来完成并发任务。 协程可以理解为轻量级的线程。 在传统的线程中,应用程序和操作系统的线程是一对一的关系,直接调用操作系统的线程开启方法。 而协程是根据一个或多个线程的可用性,映射(多路复用,执行于)在他们之上的。可以理解为协程是对操作系统的线程进行了复用,而协程本身维护了一些协程的队列,由协程来处理这些任务的执行顺序。 这种方式可以大大减少应用程序执行时的用户态和内核态的转换开销。 使用协程go 使用go 关键字来开启协程 123456789101112func TestCoroutine(t *testing.T) { t.Log("开始执行-->") for i := 0; i < 10; i++ { //此方法的参数是传递进去的,值会被拷贝 go func(i int) { t.Logf("执行num %d",i) }(i) } time.Sleep(time.Second * 1) t.Log("执行完毕--&g ...
go(七)包管理和GoMod
包go 中提供了需要内置的标准库。比如 fmt、os、time。当然很多时间需要我们自定义包。 自定义包的格式包的命名规范 不含有 _(下划线)的小写单词来为文件命名。 包名可以和文件夹的名称不一致 同一个目录下的go代码的package 保持一致 导入包 使用import 关键字创建 导入一个包的路径和url地址 import “包的路径或 URL 地址” 导入包推荐使用绝对路径,不推荐使用相对路径 示例: 12345678package package1import "fmt"func ShowMessage() { fmt.Print("显示信息")} 12345678910import ( pa "com/demo/package1"}func TestPackage(t *testing.T) { pa.ShowMessage()} 包内的可见性包内的函数是否能被其他的包访问是通过函数名称的首字母是否大小写来表示的。如果函数首字母是小写,那么不能被 ...
go(六)go错误异常机制
go错误机制Go 没有像 Java 和 .NET 那样的 try/catch 异常机制:不能执行抛异常操作。但是有一套 defer-panic-and-recover 机制。 go 的返回支持多个参数,一般由异常的信息的时候,将异常也返回给调用者,由调用者判断是否有异常需要处理。 生成异常并处理errors 类中定义了多个生成错误的相关方法。 errors.new() 创建一个错误,用于向调用者返回error 信息errors.Is() 判断是否是指定的错误类型errors.As() As 方法的作用是在第一个参数 err 的调用链中寻找和第二个参数 target 类型相同的的错误,并把找到的第一个 err 的值赋给 target ,然后返回 true;如果没有找到则返回 false。errors.Unwrap(err error) 解开内部的错误类型,一般可能会通过聚合了内部类型的自定义错误类型来返回 调用示例: 1234567891011121314151617func devide(a int,b int) (float64,error) { if(b ...
go(五)go面向对象编程
结构或对象通过type 关键字定义一个自定义的类型 type identifier struct { field1 type1 field2 type2 …} 比如user 类型 123456type User struct{ Id string Name string Age int} 自定义类型创建的时候使用 new 关键字创建 1234567func TestUser(t *testing.T) { u := new(User) u.Age = 10 u.Name = "小明" u.Id = "1" t.Log(u)} 也支持多种创建方式 1234567891011121314func TestCreate(t *testing.T) { //无参数创建 u1 := new(User) //根据参数顺序创建 u2 := User{"1","小明",12} //执行参数创建 u3 := User{ ...
go(四)go函数
函数函数是 Go 里面的基本代码块。是go语言中的一等公民。 除了main函数和 init 函数外,其他的函数都是可以有返回值的,并且go中的函数支持多个返回值。 函数中的参数传递是值传递,而不是引用传递,函数中修改的值不会影响原始的值。(map 修改的时候会影响是因为对象的副本和原对象的引用是一个) 函数支持多个返回值,在声明函数的时候再函数的末尾声明返回值的类型和个数 示例: 1func a(param int) int,string 函数也可以作为函数的参数和返回值 多个入参和出参的函数1234567891011121314func TestFunc1(t *testing.T) { sum,multiply := calcFunc(10,10) t.Logf("和为 %d 乘积为 %d",sum,multiply)}func calcFunc(a int, b int) (int, int) { return a + b, a * b}//输出//type_test.go:424: 和为 20 乘积为 100 ...
go(三)go数据容器
数组和切片数组是具有相同 唯一类型 的一组已编号且长度固定的数据项序列(这是一种同构的数据结构)。 数组的初始化12//只声明var a [3]int 123456//声明并赋值var b = [3]int{1,2,3}c := [2]int{1,2}//重新设置设置值c[0] = 4 示例: 123456789101112func TestArray(t *testing.T) { var a [3]int t.Log(len(a)) // 3 t.Log(a) //[0 0 0] var b = [3]int{1,2,3} t.Log(b) //[1 2 3] b[0] = 10 b[1] = 20 t.Log(b) //[10 20 3]} 数组的遍历使用for 遍历数组 或for range 遍历数组 1234567891011121314func TestArrayFor(t *testing.T) { arr := [4]int{1,2,3,4 ...
go(二)go简单语法和运算符
语法特点 单行注释使用 // 多行注释 /* 开头 */ 结尾的. 代码末尾不能加 分号结束符 ; 强类型语言,标准语法指定数据类型,数据类型跟在变量后面,变量前使用 var 声明变量(var 也可以不写) 基本语法 1var a int = 1 多值初始化 12345var { a int = 5 b int = 10} 自动类型推断,可以不指定数据类型,使用 := 声明变量并赋值,可省略var 可省略类型,类型自动推断。 1c := 5 一个赋值语句可对多个变量赋值 完成变量的值的交换,不需要定义临时值 12345a := 4b := 2a = b,b = a 基础数据类型go 支持多种数据类型。 空值 在go 中的空类型 使用 nil 表示.而不是null bool true 或 false 1234a := truet.Logf("a = %t",a) int 有符号数值类型,根据长度的不同可分为 int8 int16 int32 int 64 1 ...
go(一)go语言基本介绍和安装
简介 Go(又称Golang[4])是Google开发的一种 静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。罗伯特·格瑞史莫、罗勃·派克及肯·汤普逊于2007年9月开始设计Go,稍后伊恩·兰斯·泰勒(Ian Lance Taylor)、拉斯·考克斯(Russ Cox)加入项目。Go是基于Inferno操作系统所开发的。Go于2009年11月正式宣布推出,成为开放源代码项目,支持Linux、macOS、Windows等操作系统。 来自百科介绍. 在2016年,Go被软件评价公司TIOBE选为“TIOBE 2016年最佳语言”。[7] 很多公司在使用go语言,用go开发的非常出名的项目有 docker ,k8s ,InfluxDB ,OpenShift,Ethereum。是云原生开发语言,也可以用来开发区块链项目。 go 官网链接 https://golang.google.cn/ 中文相关文档 https://www.topgoer.cn/ 特点 保持简单 go语言的设计理念是足够简单,比如关键字只有 25个。学习曲线平缓,容易入门。代码的风格统一,减少语法上容易出现的错 ...

