![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
golang
文章平均质量分 61
Grayan
尽情地享受好时光吧,我们不会再在如此年轻的时候相遇了。
展开
-
golang_for循环内外声明变量的基准测试
for循环内外声明常量对函数性能的影响:使用基准测试,发现影响不大,不用在意两种写法的影响。package mainimport ( "math/rand" "testing")var letterRunes = []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_")func RandStringRunes1(n int) string { b := make([]rune, n) for原创 2020-12-07 13:58:04 · 405 阅读 · 0 评论 -
golang_strings:trim分割“/“出现的坑及解决办法
问题描述strings.Trim和strings.TrimLeft在分割带有“https://”的字符串时,会多分割一些字符,对分割结果造成影响。解决办法如果是删除前缀,使用strings.TrimPrefix替换strings.Trim和strings.TrimLeft;如果是删除后缀,使用strings.TrimSuffix。测试代码如下:package mainimport ( "fmt" "strings")func main() { test1() fmt.Print原创 2020-08-03 10:55:18 · 890 阅读 · 0 评论 -
golang_切片:切片内指定元素的删除
package mainimport "fmt"func main() { sli := []int{0,0,0,1,2,3,4,5,6,7,8,9} n := 0 ints := RemoveParam(sli, n) fmt.Println(ints)}func RemoveParam(sli []int, n int) []int { for i := 0; i < len(sli); i++ { if sli[i] == n { if i == 0 {原创 2020-07-15 23:04:32 · 2184 阅读 · 0 评论 -
golang_并发模式:work包实现无缓存的工作池
使用无缓冲的通道来创建一个goroutine池,这些goroutine执行并控制一组动作,让其并发执行。使用无缓冲的通道不会有工作在队列里丢失或者卡住,所有工作都会被处理。1.知道什么时候goroutine池正在执行工作2.如果池里的所有goroutine都忙,无法接受心得工作,可及时通过通道来通知调用者work.gotype Worker interface { Task()}...原创 2020-03-09 23:40:51 · 644 阅读 · 0 评论 -
golang_条件变量:sync.Cond作为条件变量的使用
场景:生产者消费者模型中(比如一个有缓存的channel中),生产者进行生产之前去抢锁,如果缓存已满,生产者抢锁无效;消费者进行消费之前去抢锁,如果缓存为空,消费者抢锁无效。所有在抢锁之前需要进行一个判断,称之为条件变量。sync.Cond的结构:type Cond struct { noCopy noCopy // L is held while observing or chang...原创 2020-03-09 16:24:15 · 718 阅读 · 0 评论 -
golang指针的一种用法
go中指针的一种用法:指针一般使用“*”,表示指向一个变量的值;取地址“&”表示去变量内存的地址。这里的testPointer函数返回值为一个指针bool类型,但真正返回时是一个bool的地址。在main中使用setup变量时,需要使用“*”进行取值操作package mainimport "fmt"func testPointer() *bool { setup := ...原创 2019-12-30 11:58:08 · 440 阅读 · 0 评论 -
golang_通道:goroutine间通道的用法介绍
goroutine是go程序并发的执行体,通道是它们之间的连接。创建通道:ch := make(chan int) //无缓存的通道ch := make(chan int, 3) //容量为3的缓冲通道通道的操作:发送和接收,统称为通信ch <- x //发送语句x = <- ch //接收语句,并赋值 <- ch //接收语句,丢弃结果关闭clos...原创 2019-04-17 22:35:44 · 377 阅读 · 0 评论 -
golang_切片:slice的改变对数组的影响
切片的值的改变会影响数组中的值的变化。package mainimport "fmt"//总结:切片的值的改变会影响数组中的值的变化。func main() { arr := []int{1,2,3,4,5} slice := arr[1:4] fmt.Println(slice) //2,3,4 slice[0] = 100 fmt.Println(slice) //...原创 2019-04-27 10:35:53 · 1025 阅读 · 0 评论 -
golang_map: map中如何判断key键是否存在
package mainimport "fmt"func main() { demo := map[string]bool{ "a" : false, } fmt.Println(demo["a"]) _, ok := demo["a"] //判断a是否存在 fmt.Println(ok) //true _, ok2 := demo["b"] fmt.Println(...原创 2019-04-27 13:51:13 · 9958 阅读 · 1 评论 -
golang_switch:go中switch的用法介绍
基础语法:第一种:有表达式switch 表达式{case 值1,值2: //case后的条件可以是多个值 执行语句1case 值3: 执行语句2......default: //若以上条件都不满足,则执行下面的语句 执行语句n}第二种:无表达式 switch 表达式{case 条件1: 执行语句1case 条件2: 执行语句2......default...原创 2019-06-04 23:51:54 · 941 阅读 · 0 评论 -
golang_Pool: go实现协程池
初始化一个 Goroutine Pool 池,这个Pool维护了一个类似栈的FILO队列 ,里面存放负责处理任务的Worker,然后每有一个请求就开启一个协程。之后检查当前Worker队列中是否有空闲的Worker,如果有,取出执行当前的task;没有空闲Worker,判断当前在运行的Worker是否已超过该Pool的容量,是 — 阻塞等待直至有Worker被放回Pool;否 — 新开一个...原创 2019-04-21 10:07:52 · 1074 阅读 · 0 评论 -
golang_gc:go中的垃圾回收机制原理分析
垃圾回收机制的原理是什么?Go语言的内存管理看成一个两级的内存管理结构,MHeap和MCache。上面一级管理的基本单位是页,用于分配大对象(大于 32K),每次分配都是若干连续的页,也就是若干个4KB的大小。使用的数据结构是MHeap和MSpan,用BestFit算法做分配,用位示图做回收(标记清扫算法)。下面一级管理的基本单位是不同类型的固定大小的对象(每个系统线程分配的一个本地MCache...原创 2019-04-09 17:33:40 · 503 阅读 · 0 评论 -
golang面试题分析05_链式函数的传递+defer调用
package mainimport "fmt"type Slice []intfunc NewSlice() Slice { return make(Slice, 0)}func (s *Slice) Add(elem int) *Slice { *s = append(*s, elem) fmt.Print(elem) return s}func main() {...原创 2019-04-11 21:38:41 · 432 阅读 · 0 评论 -
Go 语言实战: 编写可维护 Go 语言代码建议
Go 语言实战: 编写可维护 Go 语言代码建议目录1. 指导原则1.1 简单性1.2 可读性1.3 生产力2. 标识符2.1 选择标识是为了清晰, 而不是简洁2.2 标识符长度2.3 不要用变量类型命名变量2.4 使用一致的命名风格2.5 使用一致的声明样式2.6 成为团队的合作者3. 注释3.1 关于变量和常量的注释应描述其内容而非其目的3...转载 2019-03-31 22:58:18 · 764 阅读 · 0 评论 -
IDEA/goland 怎么取消文本编辑器打开文件
goland中如果误点这个按钮,之后所有该类型的文件都会以文本编辑器的形式打开,如何恢复原来在goland中的设定?具体步骤:settingEditorFile TypesText在红框处添加一个*.xxx(xxx表示该文件格式)restart,然后该类型文件可以在goland内部打开...原创 2019-03-17 21:29:25 · 1664 阅读 · 0 评论 -
go_并发聊天室
用法:使用nc工具win+r打开多个终端,分别在终端输入:nc 127.0.0.1 8080不同终端之间可以进行简单的通信介绍:声明handler函数,进行处理客户端发来的信息声明broadcaster函数,进行全局广播,传递数据程序使用了channel进行数据的阻塞和传递package mainimport ( "bufio" "fmt" "net" "time")......原创 2019-03-07 21:20:35 · 391 阅读 · 0 评论 -
golang_文件操作04: 文件复制
文件复制import ( "fmt" "io" "os")func main() { file1, err1 := os.Open("D:\\face.jpg") //打开文件(源文件) file2, err2 := os.Create("E:\\face.jpg") //创建文件(目标文件) defer file1.Close() defer file2.Close()...原创 2019-02-20 21:18:04 · 292 阅读 · 0 评论 -
golang_如何控制并发执行的 Goroutine 的最大数目?
demo01:var ch chan intfunc test(i int) { fmt.Println(i) time.Sleep(1 * 1e9) <-ch}func main() { ch = make(chan int, 10) for i:=0; i<1000; i++ { ch<-i go test(i) }}demo02:...原创 2019-04-18 15:28:49 · 3979 阅读 · 0 评论 -
golang_设计模式:go中单例模式的写法
百度百科:单例模式单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。1.非线程安全的单例模式package main//非线程安全的单例模式type singleton struct {}var instance *singletonfunc GetIns...原创 2019-05-05 16:28:42 · 221 阅读 · 0 评论 -
golang_interface值为nil时强转为string后的panic错误及修复
对于传入函数的值类型为interface切为nil时,进行强转时会发生panic。func main() { testString := getInterface().(string) fmt.Println(testString)}func getInterface() interface{} { return nil}Output:panic: interface con...原创 2019-05-21 20:08:06 · 1695 阅读 · 0 评论 -
golang_map的值拷贝函数实现
函数:func (p *Reporter) cloneTags(tags map[string]string) map[string]string { cloneTags := make(map[string]string) for k, v := range tags { cloneTags[k] = v } return cloneTags}传入的是...原创 2019-08-23 15:49:26 · 10982 阅读 · 0 评论 -
go-chi 简单的httpserver服务器
package mainimport ( "github.com/go-chi/chi" "github.com/go-chi/chi/middleware" "io/ioutil" "log" "net/http")func main() { r := chi.NewRouter() r.Use(middleware.Logger) r.Use(middleware.R...原创 2019-08-14 19:20:33 · 1307 阅读 · 0 评论 -
go常见错误:结构体切片为零值的坑
遇到的坑的demo如下:type Cat struct {}//打印该切片,发现为[<nil>]func main() { cats := showCats() fmt.Printf("cats:%v, len(cats):%v\n", cats, len(cats))}//将值为nil的cat加入[]*cat切片中func showCats() []*Cat {...原创 2019-08-19 15:46:36 · 2167 阅读 · 0 评论 -
golang_二分查找的隐藏bug及其优化
二分查找func binarySearch(a []int, key int) int { low := 0 high := len(a) - 1 for low <= high { mid := low + (high-low)/2 //mid := (high + low)/2 fmt.Println("mid =", mid) midVal := a[mid]...原创 2019-07-24 20:08:47 · 170 阅读 · 0 评论 -
golang_math包的使用与介绍
产生100以内的随机数rand.Seed(time.Now().UnixNano())rand.Intn(100)原创 2019-07-06 13:46:33 · 862 阅读 · 0 评论 -
Golang生成UUID
开发过程中难免要用到UUID,Golang标准库好像没有提供生成UUID的方法,在Github上面发现了一个不错的库.satori/go.uuid提供了五种生成UUID的方式:Version 1,基于 timestamp 和 MAC address (RFC 4122)Version 2,基于 timestamp, MAC address 和 POSIX UID/GID (DCE 1.1)...原创 2019-07-10 20:36:07 · 16494 阅读 · 0 评论 -
go get出现 xorWords redeclared in this block 的错误
”xorWords redeclared in this block“安装包的时候报这个错误原因:go包没有安装好解决办法:重新安装go包卸载go : sudo rm -rf /usr/local/go sudo rm -rf /usr/bin/go安装go环境...原创 2019-07-13 21:12:57 · 413 阅读 · 0 评论 -
golang_error:error错误输出的两种写法
注意:错误位置中的nil值表示没有错误if ae, ok := e.(*argError); ok {}ae表示argError类型的值,ok表示是否有值。“ * ”表示取值,这里要存在第一种写法:使用error.New创建errorfunc f1(arg int) (int, error) { if arg == 42 { //errors.New对给定的错误信息构造基...原创 2019-06-17 22:56:35 · 8778 阅读 · 0 评论 -
golang_函数:可变参数函数(传入的参数数量不限)
Variable Functions可变参数函数,传入参数的数量没有限制package mainimport "fmt"func sum(nums ...int) { fmt.Print(nums, " ") total := 0 for _, num := range nums { total += num } fmt.Println("total =",total)...原创 2019-06-13 22:31:00 · 2575 阅读 · 0 评论 -
golang_map及range的小技巧
m := make(map[string]int) _, prs := m["k2"] fmt.Println("prs:", prs) for i, c := range "go" { fmt.Println(i, c) }Output:prs: false0 1031 111_, prs := m[“k2”]prs 是判断m中k2是否存在。这个没有,为fals...原创 2019-06-12 23:50:31 · 1883 阅读 · 0 评论 -
golang_文件操作03:文件打开失败的原因,OpenFile函数插入数据
文件打开失败的原因:1、 文件不存在2、 没有打开权限3、 超过了文件打开上限内容追加:OpenFileOpen或Create调用的基本的文件打开函数*func OpenFile(name string, flag int, perm FileMode) (file File, err error)OpenFile(文件路径,打开模式,权限)用来打开文件 file,err...原创 2019-02-20 21:17:17 · 4574 阅读 · 0 评论 -
golang_文件操作02: 读文件
读文件打开文件 f,err:=os.Open()读文件 Read() 将文件的信息读取进一个[]byte切片 data := make([]byte, 100) count, err := f.Read(data)func main(){ f,err:=os.Open("./1.txt") if err!=nil{ fmt.Println("err =",...原创 2019-02-20 21:15:12 · 127 阅读 · 0 评论 -
golang_文件操作01: go中如何实现文件的写入
文件操作设备文件: 标准输出设备Stdout 例如: 显示屏 fmt.Println() //往标准输出设备写内容 标准输入设备Stdin 例如: 键盘,摄像头 fmt.Scan(&a) //从标准输入设备中读取内容,放在a中磁盘文件 1.文本文件 2.二进制文件写文件创建文件 file,err:=os.Creat()写入文件...原创 2019-02-20 21:11:33 · 1710 阅读 · 0 评论 -
golang_获取文件属性: os包中os.Stat的用法介绍
获取文件属性os.Argsos.Args是一个字符串sliceos.Args的第一个元素是os.Args[0],是命令本身的名字.一般都是从os.Args[1]开始读取数据os.Statfunc (f *File) Stat() (fi FileInfo, err error)Stat返回描述文件f的FileInfo类型值。如果出错,错误底层类型是*PathError。o...原创 2019-02-27 20:14:21 · 18792 阅读 · 0 评论 -
golang_sync: sync.WaitGroup任务组的用法介绍
sync包提供了基本的同步基元.本包的类型的值不应被拷贝。go中对同步,异步的概念:同步:一边写,一边读;异步:听课,司机开车sync.WaitGrouptype WaitGroup struct { // 包含隐藏或非导出字段}WaitGroup用于等待一组线程的结束。父线程调用Add方法来设定应等待的线程的数量。每个被等待的线程在结束时应调用Done方法。同时,主线程里...原创 2019-02-23 11:06:31 · 786 阅读 · 0 评论 -
golang_select: select的用法介绍
select作用:可以监听多个通道,不会阻塞(同switch)场景:如果监听到数据通道有值就打印,如果监听到退出开关有值就退出func main() { c:=make(chan int) //数据通道 quit:=make(chan bool) //退出开关 //子go程写数据 go func() { for i:=1;i&lt;=5 ;i++ { c&lt;-i ...原创 2019-02-23 10:32:23 · 658 阅读 · 0 评论 -
golang_网络协议: TCP/IP协议简介及C/S构架下的服务器端与客户端
网络协议协议:即传输的规则TCP/IP协议(四层)链路层: MAC: 物理地址网络层: IP : 逻辑地址传输层: 源端口,目的端口数据传输过程网络通信条件:网卡,mac地址(不需要用户处理,ARP协议=>通过ip找mac)逻辑地址,ip地址(需要用户指定,为了确定是哪个电脑接收)端口(为了确定是哪个程序接收)同一个系统,一个程序只能绑定一个端口不同系统,同一...原创 2019-02-27 16:09:26 · 1453 阅读 · 0 评论 -
golang_时间周期: time包中Ticker的用法介绍
Tickertype Ticker struct { C <-chan Time // 周期性传递时间信息的通道 // 内含隐藏或非导出字段}Ticker保管一个通道,并每隔一段时间向其传递"tick"。创建时钟周期:time.NewTicker()func NewTicker(d Duration) *TickerNewTicker返回一个新的Ticke...原创 2019-02-22 20:55:23 · 9551 阅读 · 0 评论 -
golang_定时器: time包中Timer类型函数的用法介绍
Timer1. type Timertype Timer struct { C <-chan Time // 内含隐藏或非导出字段}Timer类型代表单次时间事件。当Timer到期时,当时的时间会被发送给C,除非Timer是被AfterFunc函数创建的。time 组成time.Duration(时间长度,消耗时间)time.Time(时间点)time....原创 2019-02-22 20:53:56 · 2495 阅读 · 0 评论 -
golang_定时器: go中定义时间格式
time包提供了时间的显示和测量用的函数.定义你自己的时间格式,写下该参考时间应用于你的格式的情况: layout := "2006|01|02 3:04_05 " fmt.Println(time.Now().Format(layout))注意:layout中的时间点必须为2006年1月2日,15点4分5秒,简记为612345!15点写成3点时,显示时间会变更为12进制的时间...原创 2019-02-22 20:52:09 · 1029 阅读 · 0 评论