golang
虽迟但到灬
一起快乐的努力
展开
-
go中select用法详解
1.主要作用于channel之上package mainimport ( "fmt" "time")//dead_lock产生的一些场景func main() { /* go语言提供了一个select的功能,作用于channel之上,多路复用 select 会随机公平地选择一个case语句执行 select的应用场景:timeout的超时机制 */ ch1 := make(chan int, 1) ch2 := make(chan int, 1) ch1 <原创 2021-12-25 15:53:43 · 1294 阅读 · 0 评论 -
通过channel进行goroutine间的通信
如下代码:package mainimport ( "fmt" "sync")var wg sync.WaitGroupfunc consumer(queue chan int) { defer wg.Done() data := <-queue //将箭头右边的值放在左边 fmt.Println(data)}func main() { /* *channel提供了一种通信机制,定向发消息 */ //定义一个channel var msg1 chan in原创 2021-12-25 14:37:21 · 134 阅读 · 0 评论 -
go的读写锁
//注意:互斥锁,读写锁,同步数据,能不用锁就不用锁,性能问题,加锁和解锁是耗费时间的//绝大部分的web系统都是读多,写少//有一万个人同时读数据库,A读的时候B能读吗?为什么要加锁,写上和读上加同一把锁,并发严重下降//如果这把锁可以做到读之间不会产生影响,写和读之间会产生影响,那就很好如下代码:package mainimport ( "fmt" "sync" "time")var wg sync.WaitGroupvar rwlock sync.RWMutexfunc原创 2021-12-25 14:01:32 · 804 阅读 · 0 评论 -
go使用互斥锁实现协程同步
如下代码实现:package mainimport ( "fmt" "sync")var total intvar wg sync.WaitGroup//互斥锁var lock sync.Mutexfunc add() { defer wg.Done() for i := 0; i < 10000; i++ { lock.Lock() total += 1 lock.Unlock() }}func sub() { defer wg.Done()原创 2021-12-25 11:48:16 · 319 阅读 · 0 评论 -
使用waitgroup控制协程退出
1.waitgroup三个接口特别重要AddDoneWait如下代码import ( "fmt" "sync")//如何解决主的grouptine在子协程结束后自动结束var wg sync.WaitGroup//WaitGroup提供了三个很有用的函数/*AddDoneWait*/func main() { for i := 0; i < 5; i++ { wg.Add(1) //计数你启动了几个协程 go func(n int) { fmt.原创 2021-12-25 11:29:07 · 162 阅读 · 0 评论 -
go中的goroutine协程
如下代码:package mainimport ( "fmt" "time")//goroutine//python java C++多进程和多线程编程//go诞生的比较晚,多进程->多线程->协程 web2.0开发逐渐主流,高并发//多线程-每个线程占用的内存比较多,而且系统切换开销很大,上千,绿程/轻量级线程(协程)-用户态的线程//go语言一开始的时候就没有打算让我们实例化一个线程 - 协程//那为什么go的协程那么火,go没有历史包袱,func p() {原创 2021-12-25 11:01:04 · 313 阅读 · 0 评论 -
go的包管理
go语言中每个路径中只能有一个main包,要想跑通程序,需要在main包中引入此包如下代码:package calcfunc Add(x, y int) int { return x + y}如果我们想在main中引入这个包中的Add接口(注意:前面讲过,go语言大小写敏感)如果我们想在main中把Add引入,这个接口定义的时候必须是大写字母开头。main包中的代码如下:package main//采用字符串import "fmt"import "awesomeProject2/c原创 2021-12-24 22:15:10 · 375 阅读 · 0 评论 -
通过接口的协议理解sort的本质
如下代码package mainimport (“fmt”“sort”)type Course struct {name stringprice inturl string}type Courses []Coursefunc (c Courses) len() int {return len©}func (c Courses) Less(i, j int) bool {return c[i].price < c[j].price}func (c Courses原创 2021-12-23 23:12:36 · 534 阅读 · 0 评论 -
go的空接口三种用法
go语言中空接口有如下三种主要用法package mainimport "fmt"type Course struct { name string price int url string}func print(i interface{}) { fmt.Printf("%V\n", i)}func main() { //空接口 var i interface{} //空接口 //空接口类似与python的object //空接口:任意一个类型都赋给空接口变量 i原创 2021-12-23 22:28:35 · 1230 阅读 · 0 评论 -
go语言:继承
如下代码:package mainimport "fmt"//接口是一个协议-程序员- 1.写代码 2.解bug 其实就是一组方法的集合type Programmer interface { Coding() string //方法只是声明 Debug() string}type Designer interface { Design() string}type Manager interface { Programmer Designer Manage() string原创 2021-12-23 17:34:59 · 469 阅读 · 0 评论 -
go语言的接口详解
如下代码package mainimport "fmt"//接口是一个协议-程序员- 1.写代码 2.解bug 其实就是一组方法的集合type Programmer interface { Coding() string //方法只是声明 Debug() string}//java里边一种类型只有继承一个接口才行,如果你继承了这个接口,那么这个接口里面全部的方法,你必须实现type Pythoner struct { lib []string kuangjia []s原创 2021-12-23 16:57:31 · 770 阅读 · 0 评论 -
go语言结构体标签的意义
如加入json解析格式如下代码:package mainimport ( "encoding/json" "fmt" "reflect")type Info struct { Name string //name 是映射成mysql中的char类型还是varchar类型,还是text类型,即使能够说明,但是额外的信息max_length怎么表示 Age int `json:"age,omitempty"` //如果有不想序列化到json解析的格式中的化价格"json:原创 2021-12-20 15:44:35 · 284 阅读 · 0 评论 -
go语言如何实现继承
如下代码package mainimport "fmt"type Course struct { teacher Teacher //如果信息量比较多,怎么办,将另一个结构体的变量放进来 name string price int url string}type Teacher struct { Name string Age int Title string}func (t Teacher) teacherInfo() { fmt.Printf(原创 2021-12-20 12:36:00 · 864 阅读 · 0 评论 -
go语言结构体方法
先定义两个结构体方法:type Course struct { name string price int url string}func (c Course) printCourseInof() { fmt.Printf("课程名:%s, 课程价格:%d, 课程的地址:%s", c.name, c.price, c.url)}func (c Course) setPriceInfo(price int) { c.price = price}再看看不同的结构体方法传递方式原创 2021-12-19 22:19:05 · 375 阅读 · 0 评论 -
go语言struct各种定义和用法
如下代码:go语言中的struct无处不在//第二种实例化方式,顺序形式 c2 := Course{"scrapy", 100, "https://www.imooc.com"} fmt.Println(c2) //3.如果一个指向结构体的指针,通过结构体指针获取对象的值 c3 := &Course{"tornado", 100, "https://www.imooc.com"} fmt.Printf("%T\n", c3) fmt.Println((*c3).name, (*c3原创 2021-12-19 21:48:41 · 1189 阅读 · 0 评论 -
go语言的struct
go语言的定义以及go语言中变量或者属性大小写影响可见性package mainimport "fmt"type Course struct { name string price int url string}func main() { //go语言不支持面向对象 //面向对象的三个基本特征:1.封装,继承,多态 2.方法重载,抽象基类 //定义struct,go 语言没有class的概念,可以少理解很多,面向对象抽象的概念 //实例化 var c Course =原创 2021-12-19 21:02:11 · 120 阅读 · 0 评论 -
panic与recover函数
错误和异常是两个不同的概念错误一般是导致代码直接运行不过异常:一般指对函数逻辑有影响如下代码:package mainimport ( "fmt")func div(a, b int) (int, error) { if b == 0 { panic("被除数不能为0") } return a / b, nil}func main() { //错误是遇到可能出现的情况,这些情况会导致你的代码出现问题,参数检查,数据库访问不了 //data := 12 //strco原创 2021-12-18 23:33:37 · 475 阅读 · 0 评论 -
go语言defer的作用
1.第一种情况,.differ后面只能跟着函数调用逻辑,且是压栈操作,先入后出如下代码:package mainimport "fmt"func main() { //go语言中并没有提供try,except,finally //defer 是go体用的一种延迟调用的机制,它可以让当前函数执行完之后执行,对于python的with语句来说,更加友好 //此处有大量的逻辑要处理 fmt.Println("test1") defer fmt.Println("defer test")原创 2021-12-18 22:26:35 · 361 阅读 · 0 评论 -
go语言中省略号用法和参数
如下代码package mainimport "fmt"//func add(a, b int) { //不能解决一个问题,我可能有不定个int值传递进来}func adddian(params ...int) (sum int) { for _, v := range params { sum += v } return}func addslice(params []int) (sum int) { for _, v := range params { sum +原创 2021-12-17 22:15:17 · 638 阅读 · 0 评论 -
go的利器,指针
1.go指针定义 var a *int:定义了一个int类型的指针a1.先看如下代码package mainimport "fmt"func swap(a *int, b *int) { //用于交换a和b c := *a *a = *b *b = c}func main() { //什么是指针,先提一个问题 a := 10 b := 20 fmt.Println(a, b) var ipa *int = &a var ipb *int = &b s原创 2021-12-16 22:54:31 · 155 阅读 · 0 评论 -
当append遇到make遇到的坑
当append遇到make遇到的坑?s1 := make([]int,5)s1 = append(s1,6)得出结果:0 0 0 0 0 6不是6分析:很多人对make函数产生了假象,以为make是空的。好比是python的s1 = []原创 2021-12-15 18:32:10 · 509 阅读 · 0 评论 -
go语言slice使用的时候遇到的奇怪现象以及分析
先看底层流程图看如下代码:package mainimport "fmt"func main() { //第一个现象 a := make([]int, 0) b := []int{1, 2, 3} fmt.Println(copy(a, b)) fmt.Println(a) //造成这个现象的原因是不会去扩展a的空间 //第二个现象,修改切片的时候,影响了原来的数组的内容 c := b[:] //c[0] = 8 fmt.Println(b) fmt.Println(c原创 2021-12-15 18:23:24 · 147 阅读 · 0 评论 -
go的数组与切片
1.go的数组用法,如下代码package mainimport "fmt"func main() { //数组和python的list可以大概的对应起来理解,切片和python的list更像 //静态语言的数组:1.大小确定 2.类型一致 var courses = [3]string{"django", "scrapy", "tornado"} //1.修改值,取值,删除之,添加值,注意:后两个不支持 //取值,修改值 fmt.Println(courses[0]) cours原创 2021-12-15 17:27:16 · 546 阅读 · 0 评论 -
go的for循环
一:与C类似Go 语言的 For 循环有 3 种形式,只有其中的一种使用分号。//和 C 语言的 for 一样:for init; condition; post { }//和 C 的 while 一样:for condition { }//和 C 的 for() 一样:for { }init: 一般为赋值表达式,给控制变量赋初值;condition: 关系表达式或逻辑表达式,循环控制条件;post: 一般为赋值表达式,给控制变量增量或减量。二:与python类似的使用range关键原创 2021-12-13 22:24:24 · 477 阅读 · 0 评论 -
go子串查询,子串统计,开始和结尾判断
看如下代码package mainimport ( "fmt" "strings")func main() { //是否包含某个子串 var name string = "wwjsss:\"你是真的\"" fmt.Println(strings.Contains(name, "你是真的")) fmt.Println(strings.Index(name, "你是真的")) //统计字符出现的次数 fmt.Println(strings.Count(name, "w")) //查原创 2021-12-13 18:28:08 · 962 阅读 · 0 评论 -
go的转义字符,字符串本身带有特殊符号
1.go语言的转义字符,一般就是“",而""加上一些字符,一般也就是占用1个字节,其实际意义和C/C++转移字符差不太多。2.实际应用。如下字符串bobby:“wwj”。这种情况字符串本身带有特殊符号,我们想使其显示出来。如下代码:package mainimport "fmt"func main() { //1.求解字符串的长度 //2.涉及到中文,问题就发生了变化 //3.unicode,字符集,存储的时候需要编码utf8编码规则,utf8是一个动态的编码规则 //utf8编码,原创 2021-12-13 17:39:57 · 4018 阅读 · 0 评论 -
go语言类型转换
如下代码a := int(3.0) fmt.Println(a) //go语言中不支持变量间的隐式类型转换 var b int = 5.0 //5.0是常量,常量之间是支持隐式转换的 fmt.Println(b) c := 5.0 fmt.Printf("%T", c) var d int = c //不可以一:简单的类型转换a := int(3.0),强制类型转换二:同种底层逻辑的数据类型可以转换var a int32 = 56var b int64 = int64(a)原创 2021-12-12 17:44:23 · 324 阅读 · 0 评论 -
go基本数据类型
如上图所示注意复数一般用的较少,所以不做讨论。一:bool类型var a bool = true数值类型二:int类型如下图所示相比python而言,为什么go有那么多种数据类型 为了节省资源,很多场景之下数字有上限。上图是int8和uint8,还有uint16,int16等。三:float类型float32或者float64后面的数字必须加,系统没有提供默认float类型。fmt.Println(math.MaxFloat32)打印结果:四:byte和rune目前可以联想.原创 2021-12-11 21:02:01 · 143 阅读 · 0 评论 -
go变量的作用域
全局与局部首先强调,go中定义全局变量,要加上var,不能用其他定义量的方法。如下代码:import "fmt"var c = 20var d = 5func main() { //变量的作用域 //局部变量 var c int = 10 fmt.Println(c, d)}打印结果10 5分析:如果我们在函数体内部,定义了和全局区同名的变量,我们则会在函数体内打印出局部定义的变量值。如下代码var gender = "female" if gender == "fe原创 2021-12-11 17:37:19 · 140 阅读 · 0 评论 -
go语言常量
一:常量的基本用法1.看入戏代码const(unknown = 0female = 1male = 2)我们再想改里面的内容是不可以的。如下图所示还要注意一点://常量组如不指定类型和初始化值,该类型和上一行类型和值一致,就是等于上一个类型的表达式 const ( x int = 16 y s = "abc" z ) fmt.Println(x, y, s, z)打印结果16 16 abc abc常量的数据类型只可以是数字,布尔,字符串不使用的常量,原创 2021-12-11 17:19:54 · 78 阅读 · 0 评论 -
go中的变量
看如下代码:package mainimport "fmt"func main() { //变量的定义 //动态语言和静态语言变量的定义差别较大 //1.最基础的变量定义 //var i int //int i 把变脸类型放在了前面,而go 通过var 关键字,将变量类型放在了后面 //i = 10 //fmt.Println(i) var i int = 10 fmt.Println(i) //2.根据值自行判断变量类型 var j = 100 fmt.Println(j原创 2021-12-11 16:29:26 · 159 阅读 · 0 评论 -
golang基础语法
看如下代码:package mainfunc main() { println("hello golang")}注意:在windows下cmd打开项目对应的目录,可以进行如下操作。go run main.go 直接生成并跑程序go build main.go编译生成对应的exe代码分析:1.go代码的首行一定是package,但如果想要走入主函数package后一定要跟main2.print和println区别,后面是可以进行换行。3.主要逻辑放到main函数中...原创 2021-12-11 16:12:01 · 177 阅读 · 0 评论 -
go语言简介
一:go简介1.google开源2.编译型语言3.国内发展迅速看如下图,主流语言发展时间线由此可以到go在设计之初就考虑到多并发了。二:go优势1.语法简单2.集各种语法优势3.性能较高4.并发编程高效 - goroutine5.编译速度快三:go能做什么?1.web开发2.容器虚拟化 - docker 、k8s3.中间件 - etcd、tidb、influxdb、nsq等4.区块链5.微服务四:国内使用情况1.国内超过国外2.大量国内使用3.岗位上涨...原创 2021-12-11 15:22:10 · 4060 阅读 · 0 评论