go语言 sync 包简介及使用

sync 包的简介 Go语言的sync包提供了常见的并发编程控制锁; 在并发编程中锁的主要作用是保证多个线程或者 goroutine在访问同一片内存时不会出现混乱; golang 中使用 go 语句来开启一个新的协程。 goroutine 是非常轻量的,除了给它分配栈空间,它所占用的内存空间是微乎其微的; 但当多个 goroutine 同时进行处理的时候,就会遇到比如同时抢占一个资源,某个 goroutine 等待另一个 goroutine 处理完某一个步骤之后才能继续的需求。 在 golang 的官方文档上,作者明确指出,golang 并不希望依靠共享内存的方式进行进程的协同操作。 而是希

go 语言实践: switch 语句的使用

go语言中的 switch 可以一个条件一个分支 switch flag { case 1: fmt.Println("one") case 2: fmt.Println("two") } 可以多条件写一个分支 switch flag { case 1: fmt.Println("one") case 2,3,4: fmt.Println("two,three,four") } 可以把判断条件写到case 后面 switch { case flag == 1:

go 语言实践:欧几里得算法-求最大公约数

go语言实现欧几里得算法 求2个数的最大公约数 辗转相除法 大数对小数求余 余数不为零时,小数对余数求余 余数为零时,小数就是俩个数的最大公约数 package main import "fmt" func divisor(min, max int) (maxDivisor int) { //用大数对小数取余 complement := max % min //余数不为零,小数作为大数,将余数作为小数,大数对小数递归求余 if complement != 0 { maxDivisor = divisor(complement, min)

go 语言实践:随机数生成

go语言中的随机数 math/rand包操作随机数, rand.Seed(seedNum)方法设定种子值, rand.Intn(n)获取一个小于n的随机数,[ 同一个种子值,生成的随机数是确定的 ] 所以go语言中的随机数取决于种子的随机性, 一般情况下可以采用系统时间的毫秒数作为种子值. 当种子值相同时 package main import ( "fmt" "math/rand" ) func main() { rand.Seed(888) //获取8个小于1000的随机数 for i := 0; i < 8; i++ {

go 语言实践:冒泡排序法 和 选择排序法对比

go 冒泡排序 & 选择排序 冒泡排序 将每一个数同相邻的下一个数对比,如果比下一个数大则交换位置. func bubble(list []int) []int { //用来拍断是否完成排序 flag := true len := len(list) for i := 0; i < len-1; i++ { //预设没有发生交换 flag=true,当发生交换,flag=false flag = true for j := 0; j < len-1-i; j++ {

go 语言中的错误捕捉 panic 以及 recover修复错误

go语言中的错误处理 go语言中遇到错误,一般直接返回 error ,如果手动无法处理的 error ,可以直接触发 panic . 当遇到一些严重错误,比如数组,切片越界等错误,直接 panic 也会被触发. panic 一但被触发,当前执行的程序会退出. package main import ( "fmt" ) func main() { fmt.Println("before panic") panic("program crash") fmt.Println("after panic") } 执行结果: ./prog.go:24:2:

Go http.StripPrefix 和 File Server的使用

代码的整洁和进行合理的分流 http.StripPrefix函数的作用之一,就是在将请求定向到你通过参数指定的请求处理处之前,将特定的prefix从URL中过滤出去. 下面是一个浏览器或HTTP客户端请求资源的例子: /assets/js/page.min.js StripPrefix 函数将会过滤掉/assets/, 并将修改过的请求定向到http.FileServer所返回的Handler中去,因此请求的资源将会是: /js/page.min.js http.FileServer 返回的Handler将会进行查找,并将与文件夹或文件系统有关的内容以参数的形式返回给你 (在这里你将&

go 语言中如何实现继承

回顾 一.之前说到了go中如何实现类 传送门 二.go中如何实现类的封装 传送门 go 语言中如何实现继承 package main import ( "fmt" ) type people struct { name string age int } func (p people) GetName() string { return p.name } type Student struct { people grade int } func (s Student) GetGrade() int { return s.gr

go 语言中类的封装

go中的类的定义和使用 之前一篇博客详细介绍了go语言中如何定义类,使用类, 点击查看 go语言中如何实现封装? go是直接支持strut的封装的,go语言的可见性是根据首字母大小写来实现的. 首字母大写表示对外部可见,类似C#中的public,首字母小写,对外部不可见,类似C#中的private. package main import ( "fmt" ) type Student struct { name string age int } func (s Student) GetName() string { return s.name } func

go 语言中的类的实现,类的属性和方法

go语言中的类是如何实现的? go语言中严格意义来说是没有类的概念,当然也不存在面向对象的封装和继承, 但是go语言可以通过struct 结构体来模拟类的概念,试的我们用起来像是一种类. struct 如何来实现面向对象的类? struct 首先是一种类型,值类型.它是由一系列具有相同类型或不同类型的数据构成的数据集合. 和c语言的struct很像,用起来就相当于java / c# 中的的class . struct 的定义 下面的内容中我们直接把struct 称呼为 "类" type student struct { name string age

go语言换行的地方可以用分号替代吗?

go语言中默认用换行来表示语句结束,那么能不能用分号来代替换行呢? package main import ( "fmt" ) func main() { fmt.Println("hello world") main函数的左花括号必须在main同行,否则出错. 为什么go语言要这么玩呢? 这是为了在语言层面强制让所有使用者统一编程规范. 看看go圣经中的原话, 我来手动打一下: In effect, newlines following certain tokens are converted into semicolons, so where newline

go 语言实践:命名规则

go 语言命名 go 语言不像java 等传统面向对象语言一样有访问修饰符; 它是从语法层面做了限定: 想要对外暴露的名字必须大写字母开头 [类似 public 修饰符] 不想对外暴露的名字必须小写字母开头 [对其他包不可见,类似私有变量] 包名称命名规则 取名要有意义,不与标准库冲突; 包名与目录名一致; 包名要使用小写开头的单词; 不混合大小写或者下划线等; 如: package yijiebuyi 文件命名规则 取名要简短,有意义; 小写单词打头; 多个单词使用下划线分隔; blog_content.go 结构体命名规则 驼峰命名法. 至于大驼峰还是小驼峰取决于该结构体是否要向

go 语言中的 Timers Tickers 的使用

go语言中的 Timers 和 Tickers go语言中对某段业务逻辑在未来某一时刻执行或以一定时间间隔周期性执行的需求提供了支持; timer 可以在未来某一时间发生; ticker 可以指定时间间隔周期发生. Timers的使用 Timer表示在未来某一刻执行仅一次的事件 一旦时间到达预设时期,触发程序执行并且 timer 会调用 Stop() 函数停止再次运行. /* * @Author: your name * @Date: 2021-01-14 16:29:13 * @LastEditTime: 2021-01-14 17:03:54 * @LastEditors: P

go 语言中的channel

channel Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication)。 它的操作符是箭头 <- ch <- v // 发送值v到Channel ch中 v := <-ch // 从Channel ch中接收数据,并将数据赋值给v (箭头的指向就是数据的流向) 就像 map 和 slice 数据类型一样, channel必须先创建再使用: ch := make(chan int) 类型 Channel类型的定义格式如下: ChannelType = ( "chan" | "ch

go 标准库 container list

list 个双链表(doubly linked list) 如何遍历链表, 其中 l 为 *List : for e := l.Front(); e != nil; e = e.Next() { //链表的每一个元素中通过Next()指针指向下一个元素,直至遍历完成 } 代码: package main import ( "fmt" "container/list" ) func main() { l := list.New() l.PushFront(1) l. PushBack(2) l. PushBack(3
  • 1

回到顶部