收藏的笔记

收录了 24 篇文章 · 0 人关注

  • 数组、切片(以及字符串): append内置函数的运作机制

    介绍 数组是编程语言中最常用到的功能之一. 数组看起来是比较简单,但在一个语言要实现一个数组的时候,有些问题必须要解决,如:: 固定大小或可变大小? 是类型的一部分? 多为数组的模型? 空数组的意义? 这些问题的解决影响着数组仅是语言的一个功能还是其设计的核心部分. 你要爪子翻译于 1年前 0人顶 顶 翻译的不错哦! 在早期的Go语言发展中,在设计数组前大约用了1年的时间来决定这些问题. 关键的一步就是引入片, 可以在一个固定大小的数组上有一个灵活可扩展的数据结构. 是该类型的大小的一部分,新的...

  • Go语言fmt包Printf方法详解

    Go语言的标准输出流在打印到屏幕时有些参数跟别的语言(比如C#和Java)不同,下面是我整理的一些常用的格式化输入操作。 General %v 以默认的方式打印变量的值 %T 打印变量的类型 Integer %+d 带符号的整型,fmt.Printf("%+d", 255)输出+255 %q 打印单引号 %o 不带零的八进制 %#o 带零的八进制 %x 小写的十六进制 %X 大写的十六进制 %#x 带0x的十六进制 %U 打印Unicode字符 %#U 打印带字符的Unicode %b 打印整型...

  • GoLang 字符串处理大全

    package main import ( "fmt" "strings" //"unicode/utf8" ) func main() { fmt.Println("查找子串是否在指定的字符串中") fmt.Println(" Contains 函数的用法") fmt.Println(strings.Contains("seafood", "foo")) //true fmt.Println(strings.Contains("seafood", "bar")) //false fmt.Pri...

  • 120
    Go: 理解 Sync.Pool 的设计

    ![sync pool](https://raw.githubusercontent.com/studygolang/gctt-images/master/understand-the-design-of-sync-pool/3.jpg) ℹ️本文基于 Go 1.12 和 1.13 版本,并解释了这两个版本之间 sync/pool.go 的演变。 `sync` 包提供了一个强大且可复用的实例池,以减少 GC 压力。在使用该包之前,我们需要在使用池之前和之后对应用程序进行基准测试。这非...

  • 64行代码实现零拷贝go的TCP拆包粘包

    # 64行代码实现零拷贝go的TCP拆包粘包 ### 前言 这段时间想用go写一个简单IM系统,就思考了一下go语言TCP的拆包粘包。TCP的拆包粘包有一般有三种解决方案。 #### 使用定长字节 实际使用中,少于固定字长的,要用字符去填充,空间使用率不够高。 #### 使用分隔符 一般用文本传输的,使用分隔符,IM系统一般对性能要求高,不推荐使用文本传输。 #### 用消息的头字节标识消息内容的长度 可以使用二进制传输,效率高,推荐。下面看看怎么...

  • 基于golang的websocket

    项目中的消息通知用到了websocket,感觉比http长连接分块发送好用,特此记录一下。 WebSocket协议用ws表示。此外,还有wss协议,表示加密的WebSocket协议,对应HTTPs协议。 完成握手以后,WebSocket协议就在TCP协议之上,开始传送数据 websocket原理及运行机制 WebSocket是HTML5下一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的。它与HTTP一样通过已建立的TCP连接来传输数据,但是它和HT...

  • 使用 Goroutines 池来处理基于任务的操作

    *作者注:使用 Go 语言工作了一段时间之后,我学会了如何使用无缓冲 channel 来构建 Goroutines 池,我喜欢这种方式胜于此文章中所展示的方式。话虽如此,此文章在它所描述的场景中依然有巨大价值。* 我在多个场合都被问到为什么使用工作池模式,为什么不在需要的时候启动所需要的 Goroutines?我的答案一直是:受限于工作的类型、你所拥有的计算资源和所处平台的限制,盲目地使用 Goroutines 将会导致程序运行缓慢,进而伤害整个系统的响应和性能。 每个程序、系统和平...

  • 一个好的 Go 语言 Makefile 是怎样的

    精简的 Makefile,用于简化构建和管理用 Go 编写的 Web 服务器。 ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/a-good-makefile-for-go/makefile-process.gif) 我偶然调整我的 Makefiles 来加快我的开发过程,一天早上有点时间,我决定与大家分享其中诀窍。 总而言之,我使用 Go 构建 Web 服务器,我对 Makefile 的...

  • Go 并发模型:管道和取消

    简介 Golang的原子并发特性使得它很容易构造流数据管道,这使得Golang可有效的使用I/O和多CPU特性。本文提出一些关于管道的示例,在这个过程中突出了操作失败的微妙之处和介绍处理失败的具体技术。 什么是管道 在Golang对于管道没有明确的定义;它只是许多种并发程序中的一种。管道是通道连接的一系列阶段, 每个阶段是一组goroutine运行相同的功能。在每个阶段,goroutine运行步骤为: 从上游经过入境通道接受值 对数据执行一些功能操作,通常会产生新的值 从下游经过出境通道发送值 ...

  • golang处理signal

    signal一般用来实现优雅重启,或者重新加载配置文件等操作。 废话不多说,上表格 动作号码信号golang kill pid 15 SIGTERM terminated kill -9 pid 9 SIGKILL killed (应用程序无法捕获) kill -10 pid 10 SIGUSR1 user defined signal 1 kill -12 pid 12 SIGUSR2 user defined signal 2 ctrl+c 2 SIGINT interrupt ctrl+z...

  • Golang -- Signal处理

    我们在生产环境下运行的系统要求优雅退出,即程序接收退出通知后,会有机会先执行一段清理代码,将收尾工作做完后再真正退出。我们采用系统Signal来 通知系统退出,即kill pragram-pid。我们在程序中针对一些系统信号设置了处理函数,当收到信号后,会执行相关清理程序或通知各个子进程做自清理。kill -9强制杀掉程序是不能被接受的,那样会导致某些处理过程被强制中断,留下无法恢复的现场,导致消息被破坏,影响下次系统启动运行。 最近用Golang实现的一个代理程序也需要优雅退出,因此我尝试了解...

  • golang的fmt包

    package fmt import "fmt" mt包实现了类似C语言printf和scanf的格式化I/O。格式化verb('verb')源自C语言但更简单。 Printing verb: 通用: %v 值的默认格式表示。当输出结构体时,扩展标志(%+v)会添加字段名 %#v 值的Go语法表示 %T 值的类型的Go语法表示 %% 百分号 布尔值: %t 单词true或false 整数: %b 表示为二进制 %c 该值对应的unicode码值...

  • Go实战--golang中文件以及文件夹路径相关操作

    生命不止,继续 go go go!!! 之前介绍过golang的标准库:path/filepath, os Go语言学习之path/filepath包(the way to go) Go语言学习之os包中文件相关的操作(The way to go) 今天就跟大家分享几个关于文件以及文件夹的相关操作。 获取目录中所有文件 使用包: io/ioutil 使用方法: ioutil.ReadDir 读取目录 dirmane 中的所有目录和文件(不包括子目录) 返回读取到的文件的信息列表和读取过程中遇到的...

  • Go os包

    package main import ( "fmt" "io/ioutil" "os" "reflect" "time" ) func main() { dir, _ := os.Getwd() fmt.Println("dir:", dir) err := os.Chdir("d:/project/test2") dir, _ = os.Getwd() fmt.Println("dir:", dir) //参数不区分大小写 //不存在环境变量就返回空字符串 len(path) = 0 pat...

  • Golang 1.4 net/rpc server源码解析

    上一篇文章我们讲了net/rpc中client部分的实现,我本机源码安装路径在/usr/local/go,这net/rpc(golang 1.4版本)涉及到的相关代码主要有: server.go 方法注册: 因为从client我们知道是复用的socket来实现并发调用rpc方法,我们先从方法注册来看源码部分: // Server对象大都是保存方法存根,保证对象互斥的 type Server struct { mu sync.RWMutex // protects the serviceMap s...

  • Golang加密系列之RSA

    Golang加密系列的最后一篇,嗯,RSA涉及的概念太多,弄了好久才搞清楚。。。 代码的结构如下图 PS:StarUML这玩意在Mac上所有连到Interface的线都变成直线了...我很惆怅... 定义一个对外开放的接口 package rsa import "crypto" type Cipher interface { Encrypt(plaintext []byte) ([]byte, error) Decrypt(ciphertext []byte) ([]byte, error) S...

  • 120
    Go 语言的指针切片

    ![Image courtesy — https://xkcd.com/138/](https://raw.githubusercontent.com/studygolang/gctt-images/master/uh-oh-is-in-go-slice-of-pointers/1.png) Go 让操作 Slice 和其他基本数据结构成为一件很简单的事情。对于来自 C/C++ 令人畏惧的指针世界的人来说,在大部分情况下使用 Golang 是一件令人幸福的事情。对于 **JS/Python...

  • 写爬虫还在用 python?快来试试 go 语言的爬虫框架吧

    今天为大家介绍的是一款 go 语言爬虫框架 -- colly。 开始 首先,你可以使用一下命令安装 colly。 go get -u github.com/gocolly/colly/... 其次,构建 Collector,添加事件,然后访问: package main import ( "fmt" "github.com/gocolly/colly" ) func main() { // 初始化 colly c := colly.NewCollector( // 只采集规定的域名下的内容 co...

  • Golang 如何从socket读出所有数据

    第一种: func read(conn *net.Conn) error { defer conn.Close() buf := make([]byte, 0, 4096) len := 0 for { n, err := conn.Read(buf[len:]) if n > 0 { len += n } if err != nil { if err != io.EOF { //Error Handler } break } } // buf[:len] is the content } 第二...

  • Go 执行追踪器(execution tracer)

    ## 概述 你有没有好奇过 Go 运行时是如何调度 goroutine 的?有没有深入研究过为什么有时候加了并发但是性能没有提高? Go 提供了执行跟踪器,可以帮助你诊断性能问题(如延迟、竞争或低并发等)、解决前面那些疑问。 Go 从 1.5 版本开始有执行跟踪器这么一个工具,原理是:监听 Go 运行时的一些特定的事件,如: 1. goroutine的创建、开始和结束。 2. 阻塞/解锁goroutine的一些事件(系统调用,channel,锁) 3. 网络I/O相关事件 ...

  • 在 Golang 中开发中使用 Makefile

    使用 Golang 已经有一阵了,在 Golang 的开发过程中,我已经习惯于不断重复地手动执行 go build 和 go test 这两个命令. 不过,现在我已经摆脱了这个习惯。如果只用到了不带参数的简单命令,直接这么操作可能并不可怕。但是在一些复杂的任务中,如果依旧是手动执行 go build 和 go test ,就可能会成为一个让人头疼的事情。 我们可以通过其他方式解决这个问题。比如,可以用一个 bash 脚本来完成这些工作,或者一个更好的选择(至少对于我来说)是,写一个 makefi...

  • webhook 是什么以及如何创建

    我们在网上做的工作,大部分其实就是事件,webhooks 已经成为了连接系统的主要方式,不管是用户创建、支付成功、DockerHub 镜像推送或者 Git 仓库上的合并请求,这些都是非常有用并且轻量级的共享信息的方式 ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/webhook/1.png) 那么,webhook 究竟是什么呢?webhook 是应用给其它应用提供实时信息的一种方式。信息一产生...

  • Go语言开发学习教程

    Go语言开发学习教程 Go语言开发学习教程目录如下: Go语言开发(一)、Go语言简介http://blog.51cto.com/9291927/2126775Go语言开发(二)、Go语言基础http://blog.51cto.com/9291927/2127825Go语言开发(三)、Go语言内置容器http://blog.51cto.com/9291927/2129969Go语言开发(四)、Go语言面向对象http://blog.51cto.com/9291927/2130132Go语言开发(...

  • Go语言开发(十)、GoLand常用快捷键

    Go语言开发(十)、GoLand常用快捷键 一、Goland快捷键设置 GoLand支持各种编辑器的快捷键映射:File->Settings->Keymap 二、GoLand常用快捷键 1、查询快捷键 CTRL+N 查找类 CTRL+SHIFT+N 查找文件 CTRL+SHIFT+ALT+N 查找类中的方法或变量 CTRL+B 快速打开光标处的类或方法 CTRL+ALT+B 找所有的子类 CTRL+SHIFT+B 找变量的类 CTRL+G 定位行 CTRL+F 在当前窗口查找文本 CTRL+SH...