go语言学习
努力是不想被淘汰
努力、学习
展开
-
golang优雅退出(进阶)
之前写过一篇程序优雅退出的文章优雅退出:https://blog.csdn.net/qq_34673519/article/details/100128562但是该策略存在一个问题,就是当任务通道中的信号没有被处理完时,收到退出信号后,通道中的数据同样不会被执行,直接退出。package mainimport ( "fmt" "os" "os/signal" "sync" "s...原创 2019-09-06 23:29:48 · 938 阅读 · 0 评论 -
go语言使用通道实现协程优雅退出策略
在编写代码过程中如果使用了协程,通常在主程序中使用wg.Wait()等待所有协程处理结束后才能执行主程序的退出例如package mainimport ( "fmt" "sync" "time")var wg1 sync.WaitGroupfunc f1(){ time.Sleep(time.Second*5) fmt.Println("aaaaa") wg1.Done(...原创 2019-08-28 23:50:20 · 687 阅读 · 0 评论 -
双buffer防止 map读写并发
package mainimport ( "fmt" "strconv" "sync")var ( s [2]map[string]string current = 0 wg sync.WaitGroup)func w(s1 string) { tmpIndex := (current + 1) % 2 if s[tmpIndex] == nil { s[tmpIndex] = make(map[string]string) } s[tmpInd原创 2022-04-21 18:49:47 · 719 阅读 · 0 评论 -
range遍历 channel 的小坑
//package main////import (// "fmt"// "reflect"//)////type Person struct {// Name string// Age int// Sex string//}////type tool struct {// cap string// key string//}////func (t *tool) print() {// fmt.Println(t.cap, t.key)//}////func原创 2022-04-12 17:18:36 · 574 阅读 · 0 评论 -
go并发map - sync.Map
并发访问map是不安全的。所以如果希望在多协程中并发访问map,必须提供某种同步机制,常用的协程安全的访问map的方式:读写锁实现并发安全Map。一般情况下通过读写锁sync.RWMutex实现对map的并发访问控制,将map和sync.RWMutex封装一下,可以实现对map的安全并发访问。type M struct { Map map[interface{}]interface{} mu sync.RWMutex}//set mu.Lock() defer mu.原创 2020-07-21 10:17:33 · 534 阅读 · 0 评论 -
go语言--继承
go语言通过组合实现继承type B struct { A}package mainimport "fmt"type A struct{ F1 int}type B struct { A}func (this *A)fun1(){ fmt.Println("fun1:a")}func (this *A)fun2(){ fmt.Println("fun2:a")}func (this *B)fun2(){ fmt.Println("fun2:b")}func原创 2020-05-27 20:20:46 · 219 阅读 · 0 评论 -
golang-空接口和nil
package mainimport "fmt"type fun interface { get() set()}type A1 struct{}func (A1)get(){ fmt.Println("a")}func (*A1)set(){ fmt.Println("b")}func main(){ var a *A1=nil var i fun =...原创 2019-09-13 17:59:08 · 398 阅读 · 0 评论 -
golang-defer误区
package mainimport "fmt"func f1()(r int){ defer func(){ r++ }() return 0}func f2()(r int){ t:=5 defer func(){ t=t+5 }() return t}func f3()(r int){ defer func(r int){ r=r+5 }(r)...原创 2019-09-14 17:21:04 · 135 阅读 · 0 评论 -
golang-闭包中的引用
package mainimport "fmt"func fa(a int) func (i int) int{ fmt.Println("&a",&a) return func(i int) int{ fmt.Println(&a,a) a=a+1 return a }}func main(){ f:=fa(1) fmt.Println...原创 2019-09-14 18:11:27 · 452 阅读 · 0 评论 -
golang-nil切片和空切片
package mainimport "fmt"func main(){ var a []int b:=make([]int,0) if a==nil{ fmt.Println("a is nil") }else{ fmt.Println("a is not nil") } if b==nil{ fmt.Println("b is nil") }else{ f...原创 2019-09-14 18:20:00 · 6316 阅读 · 0 评论 -
golang-反射reflect
TypeOf()reflect.TypeOf(a)//如果a是具体的类型变量返回具体的类型信息//如果a是一个接口类型,且绑定具体的类型实例,返回接口的动态类型(绑定的具体实例)//如果a是一个接口类型,没有绑定具体的类型实例,返回静态类型信息package mainimport ( "fmt" "reflect")type A1 interface {}type INT...原创 2019-09-24 23:04:53 · 118 阅读 · 0 评论 -
golang-reflect(Typeof()和Kind())
package mainimport ( "fmt" "reflect")type INT intfunc main(){ var a INT fmt.Println(reflect.TypeOf(a).Name())//INT fmt.Println(reflect.TypeOf(a).Kind())//int}Type的Kind()方法返回的是基础类型...原创 2019-09-25 22:27:21 · 3682 阅读 · 0 评论 -
golang-reflect反射三定律
定律一:反射可以将“接口类型变量”转换为“反射类型对象”func TypeOf(i interface{}) Typefunc ValueOf(i interface{}) Value执行函数 reflect.TypeOf ()和 reflect.ValueOf()的入参都是作为一个接口传入,返回反射类型的对象。定律二:反射可以将“反射类型对象”转换为“接口类型变量”func...原创 2019-09-25 22:57:07 · 289 阅读 · 0 评论 -
golang-类型断言
//断言 检查x的动态类型是否是T,其中x必须是接口值x.(T)因为是检查x的动态类型,所以x必须是接口.如果T是具体类型var x interfence{}x=100i:=x.(int)//okpackage mainimport "fmt"type T interface { getName()string}type P struct { name strin...原创 2019-09-25 23:33:56 · 157 阅读 · 1 评论 -
golang-多态的实现
package mainimport "fmt"type fun interface {//接口 process()}type A1 struct{}type B1 struct{}func (a *A1)process(){ fmt.Println("a")}func (b *B1)process(){ fmt.Println("b")}func Facto...原创 2019-09-13 17:15:05 · 220 阅读 · 0 评论 -
golang-方法
go语言中通常是为自定义类型定义方法,同时要求方法的定义和类型的定义必须在同一个包内。(不能为int、bool等预声明类型定义方法,因为他们的作用域是全局)首先介绍一下c/c++与go语言结构体指针的区别:#include <iostream>#include<map>using namespace std;struct T{ int a;};in...原创 2019-09-11 23:46:46 · 124 阅读 · 0 评论 -
golang-类型系统
命名类型和未命名类型命名类型1)预声明类型(简单类型)布尔型(bool)、整型(int)、浮点型(float)、复数(complex)、字符(byte)、字符串(string)、接口(error)2)自定义类型(type声明)未命名类型(复合类型、类型字面量)数组(array)、切片(slice)、字典(map)、指针(pointer)、通道(channel)、结构(struct)...原创 2019-09-10 23:13:50 · 151 阅读 · 0 评论 -
go-json(Marshal与Unmarshal)
Json(Javascript Object Nanotation)是一种数据交换格式,常用于前后端以及客户端和服务端的数据传输。任意一端将数据转换成json字符串,另一端再将该字符串解析成相应的数据结构,如string类型,strcut对象等。利用Marshal转化为jsontype Stu struct { Name string `json:"name"` Ag...原创 2019-08-19 16:48:59 · 1782 阅读 · 0 评论 -
golang-chan和select的使用
select是Go中的一个控制结构,类似于switch语句,用于处理异步IO操作。select会监听case语句中channel的读写操作,当case中channel读写操作为非阻塞状态(即能读写)时,将会触发相应的动作。package mainimport ( "fmt" "time")var in1=make(chan int,10)var in2=make(chan int...原创 2019-08-27 22:52:58 · 2248 阅读 · 0 评论 -
golang-break(select、switch)
break能够跳出的不仅仅是for等循环,还包括select、和switch package mainimport ( "fmt")func main() { a:=10 for{ switch { case a==10: fmt.Println(a) break } } ...原创 2019-08-27 23:06:14 · 411 阅读 · 0 评论 -
go语言基础总结
字符串 var a ="hello" a[0]='b' ❎ //字符串是常量,可以访问其字节单元,但是不能修改某个字节的值 字符串尾部不包含NULL字符 与C++区分 基于字符串创建的切片和原字符串指向相同的底层字符数组,同样不能修改 指针 结构体指针访问结构体字段仍然用.,go语...原创 2019-09-01 22:13:54 · 153 阅读 · 0 评论 -
go语言-(通道不提供跨goroutine的数据访问保护机制)
当通道在多个协程之间传输的是指向数据的指针是,且读写操作是由不同的协程操作,则需要提供额外的同步动作。原因:package mainimport ( "fmt" "time")var in=make(chan *int,1)func f1(){ a:=1 b:=&a in<-b a=100}func f2(){ c:=<-in fmt.Pri...原创 2019-09-01 22:50:22 · 313 阅读 · 0 评论 -
go语言的-函数init
go语言的每个包中可以包含init函数,这些init函数都会在程序执行开始的时候被调用,所有被编译器发现的init函数都会在main()函数之前执行。(init函数,可以设置包、初始化变量或其他要在程序运行前优先完成的引导工作。)mian.gopackage mainimport "fmt"func init(){ fmt.Println("init1 star...")}fun...原创 2019-09-01 23:43:12 · 299 阅读 · 0 评论 -
golang的死锁问题(fatal error: all goroutines are asleep - deadlock!)
package mainimport ( "fmt")func f11() { for { fmt.Println("call f1...") }}func f22() { fmt.Println("call f2...")}func main() { //go f11() go f22() in:=make(chan int) <-in}执行...原创 2019-09-06 22:23:41 · 3190 阅读 · 0 评论 -
golang通道地址传递
package mainimport ( "fmt" "time")type Listener struct { chan2 chan struct{}}var in= make(map[int][]*Listener)func f1(a int)<-chan struct{}{ in1 := make(chan struct{}, 1) _, exists :=...原创 2019-09-07 18:31:15 · 478 阅读 · 0 评论 -
golang-数组做函数参数
与C/C++不同,go语言数组的工作方式有个重要的差异:1)数组是值,将一个数组赋值给另一个数组,会拷贝所有的元素2)数组作为函数参数,收到的是数组的一个拷贝,而不是它的指针3)数组的大小是类型的一部分,[10]int和[20]int是不一样的这里重点探索一下 2)首先看一下C++的代码:#include <iostream>#include<map>usi...原创 2019-09-08 13:48:44 · 4522 阅读 · 0 评论 -
golang-数组和切片的区别
数组数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值。在初始化后长度是固定的,无法修改其长度。当作为方法的参数传入时将复制一份数组而不是引用同一指针。数组的长度也是其类型的一部分,通过内置函数len(array)获取其长度。注意:和C中的数组相比,存在一些不同:1)数组是值,将一个数组赋值给另一个数组,会拷贝所有的元素2)数组作为函数...原创 2019-09-08 15:29:09 · 806 阅读 · 0 评论 -
golang-defer
defer的作用是延迟函数的调用(defer后面必须是函数和方法),常用于保证一些资源最终一定能够得到回收和释放。1、这些调用以先进后出的顺序在函数返回前执行package mainimport "fmt"func main(){ defer func(){ fmt.Println("first") }() defer func(){ fmt.Println("secon...原创 2019-09-08 18:06:27 · 107 阅读 · 0 评论 -
golang-panic和recover
这两个内置函数用来处理go的运行时错误,panic用来主动抛出错误,recover用来捕获错误。一、发生panic后,函数会从调用panic的位置返回,逐层向上执行函数的defer语句,直到被recover捕获或运行到最外层函数退出。package mainimport "fmt"func f3(){ panic("aaa")}func f4(){ f3()}func mai...原创 2019-09-09 10:00:02 · 244 阅读 · 0 评论 -
golang-runtime库
runtime.NumCPU()//查看cpu数量runtime.GOMAXPROCS(runtime.NumCPU())//多核并发执行runtime.GOOS//查看目标操作系统原创 2019-08-19 15:22:57 · 595 阅读 · 0 评论