Golang
YongYu_IT
区块链,分布式系统
展开
-
Go WaitGroup
问题由来:如何在主协程里面等待所有子协程执行完毕后再退出?方案一(原始方法):用n个lock对应n和子协程package mainimport ( "fmt" "sync" "time")func main() { locks := []*sync.Mutex{} lock1 := new(sync.Mutex) lock1.Lock() go doFunc(5, lock1) locks = append(locks, lock1) lock2 := new(原创 2020-06-08 19:26:32 · 201 阅读 · 0 评论 -
Go error深入
1、Go error本质上是什么?type error interface { Error() string}说白了,error实际上是一个接口,接口里面就一个方法:Error() string2、如何自定义错误类型2.1 既然是接口,那就定义一个实现类package mainimport ( "fmt" "reflect")type MyErr1 struct {}func (this *MyErr1) Error() string { return "原创 2020-05-29 16:04:44 · 514 阅读 · 0 评论 -
Go里面的new和make
1、如果变量定义时没有初始化,那么初值是多少?package mainimport ( "fmt" "strings")func main() { var a int fmt.Println("a-->", a) var b string fmt.Println("b is empty-->", strings.EqualFold(b, ""))}a--> 0b is empty--> true可见,对于值类型的变量,定义的时候就会分配内存,原创 2020-05-15 11:33:30 · 227 阅读 · 0 评论 -
关于Go Context
参考:https://studygolang.com/articles/12566package mainimport ( "bufio" "context" "fmt" "os" "strings")//这个程序的消息总线var MessageBus = make(chan string)type CtxWithCancel struct { Ctx context.Context CtxId string CancFunc context.Cance原创 2020-05-14 16:26:43 · 245 阅读 · 0 评论 -
Go语言里的那些坑(一)允许变量重复定义
package mainimport "fmt"import "math/rand"import "unsafe"func main() { a := 0 for i := 0; i < 10; i++ { fmt.Println("start-->", a, unsafe.Pointer(&a)) a := f() fmt.Println("en...原创 2020-05-08 14:38:20 · 1522 阅读 · 2 评论 -
Go struct tag
package mainimport ( "fmt" "reflect")type Student struct { Name string `tag1:"stu_name" tag2:"1001"` Num string `tag1:"stu_num"`}func main() { yong := Student{"thinking", "No.10001"} v...原创 2020-04-14 18:37:51 · 180 阅读 · 0 评论 -
Go语言第二十课 计时器 time.Time
package mainimport ( "bufio" "fmt" "os" "strings" "time")var prt_str stringfunc main() { channel_test := make(chan string) go output(channel_test) for { inputReader := bufio.NewRea...原创 2019-10-23 11:26:51 · 335 阅读 · 0 评论 -
Go语言第十五课 共享内存和竞争机制——锁
互斥锁读写锁构造锁原创 2018-07-03 10:54:35 · 673 阅读 · 0 评论 -
Go语言第十七课 Go的单元测试
go test命令1、包目录内,所有以_test.go结尾的文件都不是go build编译的一部分!他们都是go test测试的一部分。2、*_test.go文件中,有三种测试函数:测试函数、基准测试函数、示例测试函数。测试函数:以Test打头的函数,用于测试一些逻辑是否正确,go test命令跑出来的结果是PASS或者FAIL;基准测试函数:以Benchmark打头的函数,同于衡量函数的性能,g...原创 2018-07-11 16:07:36 · 281 阅读 · 0 评论 -
Go语言第十八课 CGO
可借助CGO实现Go语言对C的调用,下面展示几种调用方式。1、直接嵌套C代码C代码内容如下:#include <stdio.h>#include <stdlib.h>#include <string.h>char* test_hello(const char* name){ const char* hello=" -> hel...原创 2018-07-23 15:17:29 · 1272 阅读 · 0 评论 -
Go语言中同一个package中函数互相调用undefined的问题
参考:https://blog.csdn.net/weixin_38204723/article/details/81068811转载 2018-08-24 15:08:58 · 4424 阅读 · 0 评论 -
Golang协程原理(一)
转自:https://studygolang.com/articles/9592?p=1协程是应用层的线程 应用层是相对于内核层而言,是操作系统的概念,对应的是cpu的运行级别。操作系统的核心代码运行的ring0级别,应用程序的代码运行在ring3级别。内核与应用层的级别设置保证了一些高权限的操作只有内核代码能做,应用程序要使用这些功能必须通过调用操作系统的API(linux上称为系统调用...转载 2018-09-19 09:45:22 · 2070 阅读 · 0 评论 -
Golang协程原理(二)
转自:https://www.cnblogs.com/zhaodahai/p/6831461.html我们都知道Go语言是原生支持语言级并发的,这个并发的最小逻辑单元就是goroutine。goroutine就是Go语言提供的一种用户态线程,当然这种用户态线程是跑在内核级线程之上的。当我们创建了很多的goroutine,并且它们都是跑在同一个内核线程之上的时候,就需要一个调度器来维护这些gor...转载 2018-09-19 09:46:54 · 1693 阅读 · 0 评论 -
Go语言第十九课 反射
Go类型断言我们常用interface{}类型去接实参,企图实现类型泛型的效果。例如func add(a interface{}, b interface{})(c interface){////}但是在实际处理的时候,我们又希望得到实际的类型这时候我们就可以使用类型断言情况1:我们知道传入的类型,例如var a interface = 1b,flg= a.(...原创 2018-09-20 09:53:15 · 597 阅读 · 0 评论 -
go-import下划线的作用
转载:https://studygolang.com/articles/4356转载 2019-01-23 11:43:03 · 377 阅读 · 0 评论 -
Go类型专题总结
1、为什么在常见的代码里,接口变量var test someInterface一般被赋予指针值,而非对象?首先假设定义一个接口type BaseType interface { Opt(a int, b int) string}我们常见的实现方式时在指针上实现这个接口type PType struct { Name string}func (thiz *PType)...原创 2019-05-31 10:51:24 · 232 阅读 · 0 评论 -
Go语言第十一课 并发(四)select关键字
语法现象select{ case <-ch1 : //消费ch1数据,抛弃数据 case x := <-ch2 : //消费ch2数据,赋给x case ch3 <- y : //向ch3传递数据y default : //默认操作}· 每个case必须包含一个通信操作。当通信操作完成后会执行case对应的语句块。· 如果case中没有任何一个就绪,那么sele...原创 2018-07-03 10:05:27 · 258 阅读 · 0 评论 -
Go语言第十二课 集合类型
数组什么是数组这是一个古老的数据结构概念了:有序、同类、定长的集合就是数组。如何定义?最标准的:var arry_a [3]int = [3]int{1,2,3}其他的var arry_a [3]int //这种情况下,arry_a的三个元素将被赋默认零值var arry_a [3]int =[3]int{1,2}//这种情况下,arry_a[2]将被赋默认零值...原创 2018-06-27 15:35:20 · 210 阅读 · 0 评论 -
Go语言第一课 Go语言特性
Go语言是编译型语言Go语言是编译型语言。所谓编译型语言,编译之后生成的是本地机器指令。Go语言是静态编译的。注:动态编译是否嵌入外部代码是区分静态/动态编译的标准。将外部代码嵌入到当前生成的可执行文件中的就是静态编译,以跳转的方式引用外部代码的就是动态编译。最常见的就C/C++,一般外部开发者会将自己的代码编译成.so库(动态链接库)或者.o库(静态链接库)提供给别的开发者使用。动态编译生成的可...原创 2018-06-11 16:33:05 · 904 阅读 · 0 评论 -
Go语言第二课 循环结构
常见的循环结构package mainimport ( "fmt" "os" "strconv")func main() { //常规结构 for i := 0; i < 10; i++ { fmt.Print(i) fmt.Print(" ") } fmt.Print("\n") //仅判断条件 i := 0 for i < 10 { ...原创 2018-06-12 10:33:07 · 343 阅读 · 0 评论 -
Go语言第三课 预定义部分
Go语言的关键字共25个break default func interface selectcase defer go map structchan else goto package switchconst fallthrough if range typecontinue for import return varGo语言的内建常量共4个true false iota nilGo语言的内建类...原创 2018-06-12 11:34:20 · 294 阅读 · 0 评论 -
Go语言第四课 声明
名称的可见性3句话概括:一个名称(无论是函数名还是变量名)1、如果是在函数内部定义的,只在函数内部可见2、如果是在函数外部定义的,在当前包可见3、如果是在函数外部定义的且是大写开头,包外可见*包名一般小写声明Go里面有四中声明1、变量声明——var2、常量声明——const3、类型声明——type4、函数声明——func...原创 2018-06-12 13:37:44 · 154 阅读 · 0 评论 -
Go语言第五课 指针
目前为止,我所见过的语言里面有指针的就两个:Go和C/C++两种指针还是有诸多类似的地方,下面我们将这两种指针对比着来学习内存地址· Go:不是每个值都有内存地址,但是每一个变量都有其内存地址,允许被&操作。聚合类型的每个成员(结构体的每个字段、数组的每个元素)也有内存地址,允许被&操作。· C/C++:只要是值就有内存地址,只是区分堆地址、栈地址而已。所有值都可以...原创 2018-06-12 14:39:06 · 296 阅读 · 0 评论 -
Go语言第六课 变量的生命周期
包级变量包级变量的生命周期与进程生命周期一致。局部变量局部变量的生命周期是动态的。局部变量的生命周期从创建变量开始,到不在被引用为止(之后则等待垃圾回收机制回收)。局部变量的值可能在变量可见域之外仍然可用!在局部变量可见域之外使用对应的值可能会导致值的生命周期变长(实际上这时发生了变量逃逸——即从堆区逃逸到栈区,虽然这不会对程序员编写正确代码产生任何影响,但是变量逃逸会产生性能损耗)。* 变量逃逸...原创 2018-06-12 15:48:07 · 957 阅读 · 1 评论 -
Go语言第七课 网络编程初步
两个重要的参考网站https://github.com/astaxie/build-web-application-with-golanghttp://www.gorillatoolkit.org/原创 2018-06-13 09:46:31 · 201 阅读 · 0 评论 -
Go语言第八课 gRPC
环境配置安装protobuf编译工具(参考https://github.com/google/protobuf/releases)$ wget https://github.com/google/protobuf/releases/download/v3.5.1/protobuf-cpp-3.5.1.zip$ unzip protobuf-cpp-3.5.1.zip####参照protobuf-3...原创 2018-06-13 14:58:44 · 383 阅读 · 0 评论 -
Go语言第八课 gRPC(续Go客户端验证)
gRPC官方说明http://doc.oschina.net/grpc在上一个项目gRPC-test的同级目录下建立新项目gRPC-test-cli结构如下.├── gRPC-test│ ├── main.go│ └── proto-src│ ├── helloworld.pb.go│ └── helloworld.proto└── gR...原创 2018-06-13 15:58:36 · 284 阅读 · 0 评论 -
Go语言第九课 结构体与接口
Go是一门面向过程的语言,没有类。但是类似于C,有结构体。Go语言还有一个神奇的地方,没有pubic或者private。包级元素+大写开头=可导出,可导出意味着包外可访问。关于结构体关于“继承”其实Go里面没有继承,有的只是struct的嵌入(官方叫法“嵌入”)package inheritanceimport "fmt"type FatherClass struct...原创 2018-06-14 17:17:58 · 1490 阅读 · 0 评论 -
Go语言第十课 函数与方法
关于函数函数定义func 函数名(形参列表) (返回参数列表){ 函数体}如果函数没有返回值,返回参数列表可以省略。Go里面没有“形参默认值”一说。Go里面有些没有函数体的函数,这说明这个函数不是Go实现的,可能是其他语言实现的。关于返回值Go里面一个函数可以返回多值,这是比较特殊的地方。当函数的某个返回值不被关注时,可以用“_”忽略它。函数值...原创 2018-06-15 10:06:40 · 274 阅读 · 0 评论 -
Go语言第十一课 并发(一)协程
概览· Go里面实现并发有两种方式: 协程方式:goroutine+channel,支持CSP 线程方式:共享内存协程初步Go里面每一个并发执行的单元叫做一个协程(goroutine)。在Go里面对于一个函数的调用有两种方式:· f() 常规的函数调用,将在当前协程里面调用f()并等待其返回,之后继续向后执行· go f() 开启一个协程执行f()函数,并迅速返回到当前协程继续向后执行...原创 2018-06-15 16:04:30 · 232 阅读 · 0 评论 -
Go语言第十三课 关于内存
Buffer先看一个通过Buffer复用分片(动态数组)的例子package mainimport ( "bytes" "fmt")func main() { list := []byte{'a', 'b', 'c', 'd', 'e'} fmt.Println(string(list)) buf_list := bytes.NewBuffer(list) buf_list...原创 2018-06-29 10:40:14 · 187 阅读 · 0 评论 -
Go语言第十四课 错误与异常
概念在Go里面错误与异常是两个概念错误是可以预期的,错误发生后,程序应该可以自行处理。异常是不可预期的,异常的发生常常会导致程序崩溃。关于错误内建类型errorpackage mainimport ( "fmt")func main() { a, err := testError(10, 0) if err != nil { fmt.Println(e...原创 2018-06-29 13:36:24 · 307 阅读 · 0 评论 -
Go语言第十六课 JSON
type类型转JSON string(编码)Go核心库已经对JSON有比较好的支持,编码部分是由核心库encoding/json支持的。package mainimport ( "encoding/json" "fmt")type persion struct { Name string Age int Gender string School string...原创 2018-07-09 10:59:02 · 178 阅读 · 0 评论 -
Go语言第十一课 并发(二)Channel
先明确一个关于内存共享的基本概念:进程:既不共享堆内存,也不共享栈内存线程:共享堆内存,不共享栈内存协程:共享堆内存,也共享栈内存协程间通信——channelchannel类型每一个channel都是一个特殊的类型,例如可传递int类型数据的channel是chan int类型package mainimport ( "fmt" "reflect")func main() { ch...原创 2018-07-02 16:04:34 · 229 阅读 · 0 评论 -
Go语言第十一课 并发(三)Channel缓存与阻塞
Channel的缓存前面介绍过channel的创建方法:channel_test := make(chan string)其实它完整的写法应该是:channel_test := make(chan string,0)这种容量为0的channel就是无缓存channel。对应地,我们也可以创建有缓存channelchannel_test := make(chan string,1)无缓存channe...原创 2018-07-02 17:10:49 · 1206 阅读 · 0 评论