
golang
笔记
flowerxxxxx
flower
展开
-
分布式websocket探索
一提到服务拆分就会联想到微服务,但是为了这个我们可能要付出重构的代价,凭着合适才是王道的想法,我放弃用微服务重构而是采用服务拆分的思想,以下将不考虑微服务拆分。我们首先考虑将websocket和web业务进行拆分,用消息队列(以NSQ为例)进行主web业务与websocket业务的下发通讯原创 2022-12-13 23:01:42 · 1138 阅读 · 0 评论 -
【golang】协程和线程的区别
在多核处理场景中,线程是并发与并行同时存在的,而go协程依托于线程,因此多核处理场景下,go协程也是并发与并行同时存在的。协程从属于某一个线程,多个协程可以调度到一个线程中,一个协程也可能切换到多个线程中执行,因此协程与线程是多对多(M:N)的关系。协程: 协程属于用户态轻量级的线程,协程的切换不需要经过用户态与内核态的切换,且切换时只需要保存极少的状态值,因此切换速度快数倍,大约为0.2微秒左右。线程: 抢占式调度。线程: 线程上下文的切换需要经过操作系统用户态与内核态的切换,切换速度大约为1~2微秒。原创 2022-11-08 19:44:52 · 684 阅读 · 0 评论 -
golang-wire依赖注入示例
当需要初始化的各个函数带有依赖性质的时候,此时就是wire发挥作用的时刻。此时在app目录下输入wire即可生成wire_gen.go。原创 2022-09-25 20:48:38 · 479 阅读 · 0 评论 -
golang-GC原理-笔记
golang-gc-gmp模型笔记原创 2022-09-03 18:06:51 · 158 阅读 · 0 评论 -
golang-grpc-操作,安装
按照grpc官方文档来运行and注:source_relative 会直接在本文件夹生成,而且不同于过往版本只生成一个pb.go在prot文件夹指定然后将source_relative换成import即可eg:为目标proto所处地址。原创 2022-08-28 19:57:41 · 441 阅读 · 0 评论 -
golang-channel-一个基础channel并行操作的简单函数
这是一个基于网请求的函数,很巧妙的进行多个连接的检索,如果有一条查询到了那么其他goroutine将会走default字段,以此达到同时连接最多节点的同时达到接收数据的最快化。原创 2022-08-02 18:10:43 · 183 阅读 · 0 评论 -
golang-gin-优雅重启
当gin框架部署以及运行的时候,如果瞬间重启或关闭,可能会造成其中的进程或者函数执行不完整,形成脏数据,导致系统个别功能运行异常。因此优雅的重启以及关闭是非常有必要的。原理关闭httpserver后延迟几秒关闭系统,待各个函数运行完毕。并且加入证书位置来开启tls。代码设置在main.go函数。此为https的请求,调用。如果为http则只需改为。...原创 2022-07-27 21:40:06 · 1424 阅读 · 0 评论 -
golang-gin-pprof-使用以及安全问题
我们将接口注册到新的路由组里,并且将(账号+冒号+密码)Base64后并添加Basic标识,即可触发访问也要输入账号和密码的保护机制。Gin框架所携带的pprof直接调用即可,但是在生产环境中会引发暴露的问题,导致/debug/pprof接口暴露到公网。...原创 2022-07-21 18:36:46 · 1029 阅读 · 0 评论 -
golang-gin-gorm-sql注入及解决方案
eg:(查询操作使用 db.Prepare() 方法声明预处理 SQL,使用 stmt.Query() 将数据替换占位符进行查询,更新、插入、删除操作使用 stmt.Exec() 来操作。)3. 使用Raw的占位符来处理sql注入问题(推荐)eg:完美避免测试(使用占位符):sql注入成功测试(不使用占位符,纯纯拼接sql)...原创 2022-06-09 21:03:10 · 4823 阅读 · 0 评论 -
golang-gin-websocket问题
接口全览//聊一聊接口func Handler(c *gin.Context) { fmt.Println("进入函数") //获取发送者uid和被发送者uid token := module.WsGetTokenFromHeader(c.Request.Header) fmt.Println(token) stuNum := dao.Redis.Get(token).Val() toStuNum := c.Query("toStuNum") if stuNum == toStuNum {原创 2022-04-21 11:22:22 · 2919 阅读 · 0 评论 -
golang-select解决管道数据阻塞问题
package mainimport "fmt"func main() { //使用select解决管道取数据导致的阻塞问题 //1.定义一个管道 10个数据int intChan := make(chan int, 10) for i := 0; i < 10; i++ { intChan <- i } //2.定义一个管道,5个数据string stringChan := make(chan string, 5) for i := 0; i < 5; i原创 2022-02-21 22:32:25 · 745 阅读 · 0 评论 -
golang-channel读取数据
当读取channel时,channel不会关闭而是持续性监听(for 循环且intChan开启)package mainimport ( "fmt" "time")// WriteDatafunc writeData(intChan chan int) { for i:=1;i <= 50;i++{ //放入数据 intChan <- i fmt.Printf("writeData 写入数据=%v\n",i) time.Sleep(500) } clos原创 2022-02-18 18:12:36 · 2180 阅读 · 0 评论 -
golang-正则表达式爬虫实例(拉勾网泛用)
爬取拉勾网求职信息并生成excel文件package mainimport ( "errors" "fmt" "github.com/tealeg/xlsx" "io" "net/http" "regexp" "strconv" "sync")type CompanyInfo struct { ZhiWei string ChengShi string LowestWage string HighestWage string CompanyName s原创 2021-12-30 18:38:22 · 261 阅读 · 0 评论 -
golang-colly实例
goqueryhttps://blog.youkuaiyun.com/yang731227/article/details/89338745eg1:fcdm爬虫package mainimport ( "fmt" "github.com/PuerkitoBio/goquery" "github.com/gocolly/colly" "strconv" "time")func main(){ t := time.Now() c := colly.NewCollector() content原创 2021-12-30 18:36:20 · 460 阅读 · 0 评论 -
golang-gin-中间件
eg://HandFuncfunc indexHandler(c *gin.Context) { fmt.Println("index") c.JSON(http.StatusOK, gin.H{ "msg": "index", })}//定义一个m1中间件:统计耗时func m1(c *gin.Context) { fmt.Println("m1 in ....") //即使 start := time.Now() c.Next() // 调用后续的函数 !!!!..原创 2021-10-23 20:38:56 · 437 阅读 · 0 评论 -
golang-gin-路由和路由组
//路由组的组 videoGroup := r.Group("/video") { videoGroup.GET("/xxx", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"msg": "访问路由组成功"}) }) videoGroup.GET("/pppp", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"msg": "访问路由组成功"}) }) vi.原创 2021-10-23 19:18:39 · 532 阅读 · 0 评论 -
golang-gin-file
获取文件func main() { router := gin.Default() router.Use(Cors()) router.POST("/upload", func(c *gin.Context) { //获取文件头 file, err := c.FormFile("upload") if err != nil { c.JSON(http.StatusBadRequest, "请求失败") return } //获取文件名 fileName := fi原创 2021-10-23 18:22:48 · 357 阅读 · 0 评论 -
golang-gin-queryString
eg:package mainimport ( "fmt" "github.com/gin-gonic/gin" "net/http")func main(){ r := gin.Default() r.GET("/web", func(c *gin.Context) { //获取浏览器那边发请求携带的query string 参数 //name := c.Query("query") //DefaultQuery 在如果检测不到query的时候默认key值为指定的对象原创 2021-10-22 17:16:16 · 233 阅读 · 0 评论 -
golang-gin基础GET
轻量级web框架eg:package mainimport ( "github.com/gin-gonic/gin" "net/http")type msg struct{ Name string `json:"name"` Message string Age int}func main(){ r := gin.Default() r.GET("/json", func(c *gin.Context) { //方法1:使用map //data := map[str原创 2021-10-22 17:08:52 · 176 阅读 · 0 评论 -
golang-日志收集项目
main.gopackage mainimport ( "awesomeProject/study01/logagent/conf" "awesomeProject/study01/logagent/kafka" "awesomeProject/study01/logagent/taillog" "fmt" "gopkg.in/ini.v1" "time")var ( cfg = new(conf.AppConf))func run() { //1.读取日志 for ..原创 2021-10-22 10:13:50 · 460 阅读 · 0 评论 -
golang-kafka
1.cmd zookeeper启动bin\windows\zookeeper-server-start.bat config\zookeeper.properties2.cmd kafka启动D:\kafka_2.13-3.0.0>bin\windows\kafka-server-start.bat config\server.properties原创 2021-10-22 10:13:32 · 258 阅读 · 0 评论 -
golang-tail
可实时读取my.log里面的内容示例:main.gopackage mainimport ( "fmt" "time" "github.com/hpcloud/tail")//tailf的用法示例func main() { fileName := "./my.log" config := tail.Config{ ReOpen: true, //重新打开 Follow: true, //是否跟随 Location: &tail.Se原创 2021-10-20 17:09:43 · 188 阅读 · 0 评论 -
golang-context
eg:package mainimport ( "context" "fmt" "sync" "time")var wg sync.WaitGroupfunc f(ctx context.Context) { defer wg.Done() FORLOOP: for { fmt.Println("牛逼") time.Sleep(time.Millisecond * 500) select{ case <-ctx.Done(): break FORL.原创 2021-10-19 10:57:49 · 82 阅读 · 0 评论 -
golang-NSQ
启动nsqd,指定-broadcast-address=127.0.0.1来配置广播地址nsqd -broadcast-address=127.0.0.1如果是在搭配nsqlookupd使用的模式下需要还指定nsqlookupd地址:nsqd -broadcast-address=127.0.0.1 -lookupd-tcp-address=127.0.0.1:4160...原创 2021-10-15 16:19:15 · 253 阅读 · 0 评论 -
golang-redis
package mainimport ( "context" "fmt" "github.com/go-redis/redis")//redisvar ctx = context.Background()var redisdb *redis.Clientfunc initRedis()(err error){ redisdb = redis.NewClient(&redis.Options{ Addr : "127.0.0.1:6379", Password:"0原创 2021-10-13 21:07:54 · 774 阅读 · 0 评论 -
golang-mysql事务操作
eg:func transactionDemo(){ //1.开启事务 tx,err := db.Begin() if err != nil{ fmt.Printf("begin failed,err:%v\n",err) return } //2.执行多个sql操作 sqlStr1 := `update users set username=username-2 where userid = 20` sqlStr2 := `update users set username=u原创 2021-09-22 21:45:04 · 498 阅读 · 0 评论 -
golang-MYSQL预处理
eg://预处理方式插入多条数据func prepareInsert(){ sqlstr := "insert into users(username,password) values(?,?)" stmt,err := db.Prepare(sqlstr) if err != nil { fmt.Printf("prepare failed,err:%v",err) return } // 后续只需要拿到stmt去执行一些操作 //stmt.Exec(20062155,"654..原创 2021-09-22 17:57:24 · 155 阅读 · 0 评论 -
golang-querymore&detele&update&delete
查询多条数据(query_more)func query_more(userid int){ //1.SQL语句 sqlStr := `select userid,username,password from users where userid >?;` //2.执行 rows,err := db.Query(sqlStr,userid) if err != nil{ fmt.Printf("exec %s query failed,err:%v\n",sqlStr,err) r原创 2021-09-22 11:31:10 · 161 阅读 · 0 评论 -
golang-mysql连接以及查询单条信息
eg:连接数据库并存进user结构体里package mainimport ( "database/sql" "fmt" "log" _ "github.com/go-sql-driver/mysql")type user struct { id int name string age int}func main() { db, err := sql.Open("mysql", "root:020804@tcp(127.0.0.1:3306)/sakura") ..原创 2021-09-22 10:24:08 · 347 阅读 · 0 评论 -
golang-flag包
os.Argsflagflag.Type()eg:原创 2021-09-17 20:20:14 · 127 阅读 · 0 评论 -
golang-性能基准测试
go test -bench=Splitgo test -bench=Split -benchmemeg:func Split(str string,sep string) []string { // str:"abcef" sep = "bc" var ret []string index := strings.Index(str, sep) for index >= 0 { ret = append(ret, str[:index]) str = str[index+l原创 2021-09-14 11:39:00 · 210 阅读 · 0 评论 -
golang-单元测试
开发自己给自己的代码写测试原创 2021-09-12 20:17:45 · 92 阅读 · 0 评论 -
goalng-http_client实例
package mainimport ( "fmt" "io/ioutil" "net/http" "net/url")// net/http Client//net/http Client //保持长连接 //共用一个client适用于 请求比较频繁var ( client = http.Client{ Transport: &http.Transport{ DisableKeepAlives: false, }, })func mai原创 2021-09-10 17:46:51 · 87 阅读 · 0 评论 -
golang-http_server
eg:package mainimport ( "fmt" "io/ioutil" "net/http")//net/http serverfunc f1(w http.ResponseWriter, r *http.Request){ b,err := ioutil.ReadFile("./douban.html") if err != nil { w.Write([]byte(fmt.Sprintf("%v",err))) } w.Write([]byte(b))}原创 2021-09-08 21:30:46 · 97 阅读 · 0 评论 -
golang-UDP协议
eg:client(客户端)package mainimport ( "bufio" "fmt" "net" "os")//UDP clientfunc main() { socket ,err :=net.DialUDP("udp",nil,&net.UDPAddr{ IP: net.IPv4(127,0,0,1), Port:40000, }) if err != nil { fmt.Println("连接服务器失败, err:", err) .原创 2021-09-08 19:35:31 · 342 阅读 · 0 评论 -
golang-TCP通信实例
client(用户端)package mainimport ( "fmt" "net")// tcp clientfunc main() { //1.与server端建立连接 conn,err := net.Dial("tcp","127.0.0.1:20000") if err != nil { fmt.Println("dial failde err:",err) return } //2.发送数据 conn.Write([]byte("hello mayil..原创 2021-09-08 17:21:54 · 303 阅读 · 0 评论 -
golang-atomic原子操作
package mainimport ( "fmt" "sync")//原子操作var x int64 var wg sync.WaitGroup var lock sync.Mutex func add(){ lock.Lock() x++ lock.Unlock() wg.Done()}func main() { wg.Add(100000) for i := 0; i < 100000; i++ { go add() } wg.Wait().原创 2021-09-08 10:43:27 · 138 阅读 · 0 评论 -
golang-sync.Map
单纯的用map开启goroutine是不安全的,如:package mainimport ( "fmt" "strconv" "sync")var m = make(map[string]int)var lock sync.Mutexfunc get(key string)int{ return m[key]}func set(key string, value int){ m[key] = value}func main() { wg := sync.WaitG原创 2021-09-07 21:56:11 · 111 阅读 · 0 评论 -
golang-sync.Once
sync.Once是在代码运行中需要的时候执行,且只执行一次。eg:package mainimport ( "fmt" "sync")var wg sync.WaitGroupvar once sync.Oncefunc f1(ch1 chan<- int){ defer wg.Done() for i:=0;i<100;i++ { ch1 <- i } close(ch1)}func f2(ch1 <-chan int, ch2 chan原创 2021-09-05 21:49:32 · 92 阅读 · 0 评论 -
goalng-互斥锁
同时创建两个goroutine,共享资源以后结果会出现错误var x = 0var wg sync.WaitGroupfunc add(){ for i := 0; i <5000;i++{ x = x + 1 } wg.Done()}func main() { wg.Add(2) go add() go add() wg.Wait() fmt.Println(x)} 运行结果:因共享资源访问,导致出现错误。互斥锁eg:var x = 0var w原创 2021-08-31 20:53:30 · 105 阅读 · 0 评论