go小程序
思维的深度
这个作者很懒,什么都没留下…
展开
-
Golang合并多个有序链表
package mainimport ( "fmt")func main() { n1 := &Node{ val: 1, next: &Node{ val: 4, next: &Node{ val: 5, }, }, } n2 := &Node{ val: 1, next: &Node{ val: 3, next: &Node{ val: 4, }, }, }.原创 2022-01-25 12:34:50 · 545 阅读 · 0 评论 -
Golang通过递归合并两个有序切片
var combineResult []int//通过递归合并两个有序切片func combineSortedSlice(n1, n2 []int) { if len(n1) == 0 { combineResult = append(combineResult, n2...) return } if len(n2) == 0 { combineResult = append(combineResult, n1...) return } if n1[0] < n.原创 2022-01-25 12:30:34 · 1012 阅读 · 0 评论 -
Golang通过递归合并两个有序链表
通过递归合并两个有序链表1 -> 4 -> 51 -> 3 -> 4合并之后: 1 -> 1 -> 3 -> 4 ->4 -> 5func main() { testCombine()}type Node struct{ val int next *Node}//合并两个有序链表func combineSortedLink(left, right *Node) *Node { if left == nil原创 2022-01-25 12:27:30 · 415 阅读 · 0 评论 -
Golang实现LRU Cache
146. LRU Cache运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。 实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到.原创 2021-02-25 18:09:09 · 621 阅读 · 0 评论 -
golang实现CRC8算法
CRC校验算法,就是把需要校验的数据与多项式进行循环异或(XOR),但进行异或的方式与实际中数据传输时,是高位先传、还是低位先传有关。对于数据高位先传的方式,异或从数据的高位开始,我们暂且称它顺序异或;对于数据低位先传的方式,异或从数据的低位开始,我们就叫它反序异或。本文基于表达式x^8+x^5+x^4+x^0一、顺序异或1.通过计算获取crc8//x^8+x^5+x^4+x^0func getcrc8High(buf []byte) (crc byte) { for i ...原创 2020-12-23 18:06:50 · 1271 阅读 · 0 评论 -
Golang 使用RPC
RPC介绍 远程过程调用(Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。 该协议允许运行于一台计算机的程序调用另一台计算机的程序,而程序员无需额外地为这个交互作用编程。 如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用。用通俗易懂的语言描述就是:RPC允许跨机器、跨语言调用计算机程序方法。 RPC是一种通讯网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。 RPC是远程过程调用,其...原创 2020-10-25 15:45:28 · 397 阅读 · 0 评论 -
Golang 关闭的Channel读写问题
1.向一个已关闭的channel发送元素会引起panicpanic: send on closed channelpackage mainimport ( "sync" "time")func main() { ch := make(chan struct{}) close(ch) var wg sync.WaitGroup wg.Add(1) go func() { ch <- struct{}{} time.Sleep(time.Second*2)原创 2020-08-18 19:42:52 · 4454 阅读 · 0 评论 -
Golang退出多层循环
Golang退出多层循环可以使用goto、break 标签实现,具体demo如下package mainimport ( "time" "fmt" "sync")func main() { var wg sync.WaitGroup wg.Add(2) go func() { gotoTest() wg.Done() }() go func() { breakTest() wg.Done() }() wg.Wait()}//goto 退出多层循环原创 2020-07-09 18:27:18 · 2051 阅读 · 0 评论 -
Golang zap和lumberjack实现日志存储和自动管理
期望实现功能按不同的日志级别存储到不同的日志文件中(这里只实现了info和error级别)控制最多保留的日志文件及保留最近多少天的日志文件(控制日志的最大磁盘使用量)控制每个日志文件的大小我们使用zap和lumberjack框架实现go get -u go.uber.org/zapgo get gopkg.in/natefinch/lumberjack.v2lumberjack的Logger结构体如下type Logger struct { //写日志的..原创 2020-07-09 18:24:57 · 4366 阅读 · 0 评论 -
Golang sync.Cond详细理解
sync.Cond用于goroutine之间的协作,用于协程的挂起和唤醒。结构体type Cond struct { noCopy noCopy // noCopy可以嵌入到结构中,在第一次使用后不可复制,使用go vet作为检测使用 L Locker // 根据需求初始化不同的锁,如*Mutex 和 *RWMutex notify notifyList // 通知列表,...原创 2019-10-24 20:04:06 · 3691 阅读 · 0 评论 -
Golang zap框架应用(三)—— 按时间段存储日志
功能实现1.将error以下级别添加到info.log文件中2.将error及以上添加到error.log文件中4.将日志写入到kafka服务中4.按指定时间段记录日志下载:go get -u go.uber.org/zapgo get gopkg.in/Shopify/sarama.v1go get github.com/robfig/croncron...原创 2019-09-20 18:23:48 · 2351 阅读 · 0 评论 -
Golang zap框架应用(二)——将日志信息输出到多个输出流中
目标功能:1.将error以下级别添加到info.log文件中2.将error及以上添加到error.log文件中3.将日志数据写入到kafka中(kafka客户端使用sarama)下载:go get -u go.uber.org/zapgo get gopkg.in/Shopify/sarama.v1var( producerTopic = "klo...原创 2019-09-16 20:07:21 · 4972 阅读 · 2 评论 -
Golang zap框架应用(一)——根据日志级别将日志存储到不同文件中
目标功能:根据日志级别进行不同文件存储将error以下级别添加到info.log文件中将error及以上添加到error.log文件中下载: go get -u go.uber.org/zapgithub源码:https://github.com/uber-go/zapfunc main() { logger,err := getLogger("D:/log...原创 2019-09-16 19:56:24 · 4899 阅读 · 0 评论 -
Golang中的runtime.Caller理解
func Caller(skip int) (pc uintptr, file string, line int, ok bool) 参数:skip是要提升的堆栈帧数,0-当前函数,1-上一层函数,.... 返回值: pc是uintptr这个返回的是函数指针 file是函数所在文件名目录 line所在行号 ok 是否可...原创 2019-08-23 17:07:07 · 18907 阅读 · 3 评论 -
Golang runtime包下Gosched函数的作用
这个函数的作用是让当前goroutine让出CPU,好让其它的goroutine获得执行的机会。示例一func test1() { go say("world") say("hello")}func say(s string) { runtime.GOMAXPROCS(1) for i := 0 ; i < 2; i++ { runtime.Gosched() ...原创 2019-06-28 16:28:47 · 1849 阅读 · 0 评论 -
Golang获取目录下的文件及目录信息
一、获取当前目录下的文件或目录信息(不包含多级子目录)func main() { pwd,_ := os.Getwd() //获取文件或目录相关信息 fileInfoList,err := ioutil.ReadDir(pwd) if err != nil { log.Fatal(err) } fmt.Println(len(fileInfoList)) for i := ...原创 2019-06-28 16:24:44 · 20655 阅读 · 0 评论 -
Golang并发模型的示例
并发模型Go 的并发属于 CSP 并发模型的一种实现,CSP 并发模型的核心概念是:“不要通过共享内存来通信,而应该通过通信来共享内存”。要找出10000以内所有的素数,这里使用的方法是筛法,即从2开始每找到一个素数就标记所有能被该素数整除的所有数。直到没有可标记的数,剩下的就都是素数。下面以找出10以内所有素数为例,借用 CSP 方式解决这个问题。从上图中可以看...原创 2019-05-10 19:23:19 · 714 阅读 · 0 评论 -
golang使用kafka
使用客户端:sarama需要先安装gcc,windows系统可参考:https://blog.csdn.net/skh2015java/article/details/85075032 生产者 package mainimport ( "log" "os" "time" "github.com/Shopify/sarama")var ( logger = l...原创 2019-01-31 14:19:25 · 1428 阅读 · 0 评论 -
golang解析yaml文件
首先安装解析的第三方包:go get gopkg.in/yaml.v2示例:package mainimport ( "os" "log" "fmt" "encoding/json" "gopkg.in/yaml.v2")type Config struct { Test Test `yaml:"test"`}type Test struct原创 2019-01-04 18:40:35 · 10487 阅读 · 0 评论 -
Golang字符串反序
func ReverseString(s string) string { runes := []rune(s) for from, to := 0, len(runes)-1; from < to; from, to = from+1, to-1 { runes[from], runes[to] = runes[to], runes[from] } return string...原创 2018-12-27 20:02:46 · 1907 阅读 · 0 评论 -
Golang中http请求设置cookie和header(包括GET和POST请求)
//http请求func httpHandle(method, urlVal,data string) { client := &http.Client{} var req *http.Request if data == "" { urlArr := strings.Split(urlVal,"?") if len(urlArr) == 2 { urlVa...原创 2018-10-31 14:30:12 · 38751 阅读 · 6 评论 -
golang移除数组中重复的元素
func RemoveDuplicate(list *[]int) []int { var x []int = []int{} for _, i := range *list { if len(x) == 0 { x = append(x, i) } else {原创 2017-02-24 17:34:52 · 13630 阅读 · 3 评论 -
golang使用二叉树实现排序
一个命名为S的结构体类型将不能再包含S类型的成员:因为一个聚合的值不能包含它自身。但是S类型的结构体可以包含*S指针类型的成员,这可以让我们创建递归的数据结构func main() { fmt.Println(Sort([]int{11,2,5,30,100,10,1,70}))}type tree struct { value int left,right *tree原创 2017-11-22 10:59:36 · 1023 阅读 · 0 评论 -
golang判断文件或文件夹是否存在
// 判断所给路径文件/文件夹是否存在func Exists(path string) bool { _, err := os.Stat(path) //os.Stat获取文件信息 if err != nil { if os.IsExist(err) { return true } return false } return true}// 判断所给路径是否原创 2017-12-14 19:59:00 · 48599 阅读 · 1 评论 -
golang读取文件的常用方法
//按字节读取,将整个文件读取到缓冲区bufferfunc test1() { file,err := os.Open("filetoread.txt") if err != nil { log.Fatal(err) } defer file.Close() fileinfo,err := file.Stat() if err != nil { log.Fatal(err)原创 2018-01-02 18:06:51 · 13534 阅读 · 0 评论 -
golang通过反射调用方法
package mainimport ( "fmt" "reflect" "log")func main() { //调用无参方法 reflectInterface(testReflectParam,nil) //调用有参方法 reflectInterface(testReflectParam2,getValues(5,"Hello"))}//根据参数获取对应的V原创 2018-01-11 19:41:32 · 5663 阅读 · 1 评论 -
golang逐行读取文件
func ReadLine(fileName string) ([]string,error){ f, err := os.Open(fileName) if err != nil { return nil,err } buf := bufio.NewReader(f) var result []string for { line, err := buf.ReadString(原创 2018-02-06 13:26:47 · 5235 阅读 · 0 评论 -
golang通过反射获取结构体的字段
func main() { fmt.Println(GetFieldName(Student{})) fmt.Println(GetFieldName(&Student{})) fmt.Println(GetFieldName("")) fmt.Println(GetTagName(&Student{}))}type Student struct { Name ...原创 2018-02-08 18:42:00 · 18207 阅读 · 0 评论 -
golang通过反射设置结构体字段的值
type Person struct { Name string `json:"name"` Age int `json:"age"`}func SetValueToStruct(name string,age int) *Person { p := &Person{} v := reflect.ValueOf(p).Elem() v.FieldBy...原创 2018-02-08 18:46:42 · 11438 阅读 · 0 评论 -
golang实现单例模式
package mainimport ( "sync" "fmt")type singleton map[string]stringvar ( once sync.Once instance singleton)func New() singleton { once.Do(func() { instance = make(singleton) }) retur...原创 2018-05-10 18:58:15 · 2201 阅读 · 0 评论 -
golang将切片或数组根据某个字段进行分组
package mainimport ( "fmt" "sort")type Person struct { Name string Age int}func main() { p1 := Person{"Tom",20} p2 := Person{"Lily",21} p3 := Person{"Linda",23} p4 := Person{"Jass"原创 2018-05-04 17:13:03 · 9411 阅读 · 0 评论 -
golang指数运算
func main() { fmt.Println(exponent (5,3))}//a的n次方//超出uint64的部分会丢失func exponent (a,n uint64) uint64 { result := uint64(1) for i := n ; i > 0; i >>= 1 { if i&1 != 0 { result...原创 2018-05-28 18:01:50 · 15464 阅读 · 0 评论 -
golang实现整型和字节数组之间的转换
//isSymbol来表示是否有符号func BytesToInt(b []byte, isSymbol bool) (int, error){ if isSymbol { return bytesToIntS(b) } return bytesToIntU(b)}//字节数(大端)组转成int(无符号的)func bytesToIntU(b []byte) (int, err...原创 2018-06-20 18:54:53 · 10816 阅读 · 0 评论 -
golang切片反序
package mainimport ( "fmt")func main() { fmt.Println(reverse([]byte{11,22,33,44}))}func reverse(s []byte) []byte { for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { s[i], s[j] = s[j],...原创 2018-07-09 18:17:25 · 17490 阅读 · 0 评论 -
Golang切片降序排列
package mainimport ( "sort" "fmt")type intSlice []intfunc (p intSlice) Len() int { return len(p) }func (p intSlice) Less(i, j int) bool { return p[i] < p[j] }func (p intSlice)...原创 2018-07-30 11:34:50 · 5881 阅读 · 0 评论 -
golang递归创建文件夹
package mainimport "os"func main() { createFile("D:/gopro/src/aa/bb/cc")}//调用os.MkdirAll递归创建文件夹func createFile(filePath string) error { if !isExist(filePath) { err := os.MkdirAll(fileP...原创 2018-08-09 09:52:26 · 7919 阅读 · 3 评论 -
golang并发操作变量安全问题
package mainimport ( "fmt" "time" "sync" "sync/atomic")func main() { test1() test2()}func test1() { var wg sync.WaitGroup count := 0 t := time.Now() for i := 0 ; i < 50000 ; i++...原创 2018-08-16 20:18:51 · 5218 阅读 · 1 评论 -
golang等待触发事件
type Wait interface { // Register waits returns a chan that waits on the given ID. // The chan will be triggered when Trigger is called with // the same ID. Register(id uint64) <-chan ...原创 2018-08-19 21:30:57 · 2852 阅读 · 0 评论 -
golang获取当前路径
1.获取当前目录func GetCurrentDirectory() string { dir, err := filepath.Abs(filepath.Dir(os.Args[0])) //返回绝对路径 filepath.Dir(os.Args[0])去除最后一个元素的路径 if err != nil { log.Fatal(err) } retur原创 2017-11-12 20:55:46 · 20482 阅读 · 0 评论