Go
风神韵
这个作者很懒,什么都没留下…
展开
-
判断文件为文本文件还是二进制文件
本文介绍了 git 判断文本文件和二进制文件的方法,以及在linux系统中通过 file 命令区分各种文件类型。原创 2023-09-20 16:41:28 · 1224 阅读 · 0 评论 -
Golang 异步读写文件
在Windows上支持异步读写文件,在Linux上不支持异步读写文件。能否支持异步读写文件主要是由操作系统决定的。在Linux上异步读写文件的能力并不是很好,如glibc通过线程方式和libaio底层支持方式,都有很多限制,因此Golang在Linux上只支持同步读写文件。对于网络IO,Golang在Linux上是支持异步方式的。因此可以总结:Golang对于网络IO密集型是友好的,对于磁盘IO密集型是不友好的。...原创 2022-05-31 15:07:59 · 782 阅读 · 0 评论 -
Golang IPv4 字符串与整数互转
本文描述了Golang中如何实现字符串与整数的互相转换。原创 2022-05-05 14:32:54 · 1824 阅读 · 0 评论 -
Golang 判断IPv4和IPv6是否合法
在 Golang 中,可以通过标准库的net.ParseIP 方法来判断IPv4 或 IPv6 是否合法,该方法声明如下:func ParseIP(s string) IP该方法输入是一个字符串的 IP 地址, IPv4或IPv6 都可以。如 1.1.1.1、2001:db8::68 等。当输入的 IP 是合法时,返回值 IP 为非 nil,当输入的 IP 非法时,返回值 IP 为nil。可以根据这点来判断 IP 地址的合法性。判断 IPv4 地址func IsIPv4(ip...原创 2022-05-05 11:50:36 · 4610 阅读 · 0 评论 -
Golang调试之GDB高级功能
1 使用汇编调试1.1 disassemble简写为disas,查看当前函数的汇编指令,并显示下一条要执行的执令,如下:(gdb) disassembleDump of assembler code for function main.main: 0x00000000004872c0 <+0>: mov %fs:0xfffffffffffffff8,%rcx 0x00000000004872c9 <+9>: cmp 0x10(%rcx)原创 2020-07-20 16:25:04 · 736 阅读 · 0 评论 -
Golang源码中xmm0寄存器
在阅读Golang源码时,经常看到下面一段汇编代码,如下: 0x00000000004310c8 <+24>: xorps %xmm0,%xmm0 0x00000000004310cb <+27>: movups %xmm0,0x8(%rsp) 0x00000000004310d0 <+32>: movups %xmm0,0x18(%rsp) 0x00000000004310d5 <+37>: movups %原创 2020-07-20 16:20:22 · 3316 阅读 · 0 评论 -
Go Modules使用
Go Modules使用Go Modules在Go 1.12版本后默认支持。如果是1.12之前的版本,需要设置一下GO111MODULE环境变量。1. 为什么要用Go Modules?在没有Go Modules之前,使用的是GOPATH。在使用GOPATH时,感觉非常不适的是:如果你的工程有自建包,则一定要将工程放到GOPATH下,然后import才能引用到这些包。helloword├── code│ ├── unicode.go│ └── utf8.go├── lang│ ├原创 2020-07-20 16:04:20 · 383 阅读 · 0 评论 -
Go源码之命令行参数实现
在Go中我们可以很方便的通过os.Args获取命令行参数,下面来看下是如何实现的?先看下Args声明,是一个string切片,是os包的一个全局变量:@(src/os/proc.go:15)var Args []stringArgs在os包的init函数中通过调用runtime_args被赋值,代码如下:@(src/os/proc.go:17)func init() { ... Args = runtime_args()}func runtime_args() []string原创 2020-06-22 19:55:14 · 429 阅读 · 0 评论 -
Golang源码之初始化流程
在用Go编写应用程序的时候,可以认为main.main是整个应用程序的入口,但站在整个Go程序的角度来看,却并非如此。在main.main函数之前,Go底层已经做了大量的初始化工作,下面开始从程序真正的入口开始了解下初始化前的工作。入口通过GDB可以找到程序入口:go build -gcflags "-N -l" -o test test.goinfo files会列出程序的入口地址:(gdb) info filesSymbols from "/home/sandydu/program/gol原创 2020-06-22 19:55:28 · 502 阅读 · 0 评论 -
Golang二进制反汇编
Go的源码是Plan 9汇编与Go语言的混合使用,即有汇编调用Go,也有Go调用汇编。在很多情况下,直接看汇编代码更直观,特别是在研究编译器生成的函数实现时更有用。下面介绍两种反汇编方法:假设有个helloworld.go程序,源码如下:package mainimport "fmt"func main() { fmt.Println("Hello, World!")}先将代码...原创 2019-12-03 00:12:10 · 9668 阅读 · 0 评论 -
Golang iota常量计算原理
iota,一个很奇怪的英文单词,一直想弄清楚其中文含义,但经过查证,它并不是英文缩写,而是一个完整的希腊单词,没有具体意思,常做为数学符号使用。常见用法iota主要用于常量自增,如下面一个很常见的例子,当iota赋值给常数A后,第一个常数A值为0,后面的常数会自动加1:const ( A = iota // 0 B // 1 C ...原创 2019-11-20 11:18:21 · 698 阅读 · 0 评论 -
Golang源码编译
Golang官网有各种安装包,不需安装解压就可使用,但有时候想调试或自已修改代码就需要自已编译安装。Golang 1.4版本以前是用C写的,可以直接用GCC编译;但到了1.5就开始用GO写,再用GCC就没法编译,需要用GO编译GO!所以如果要编译1.5及以上版本就需要先编译一个1.4版本的Go,或者直接下载各个版本的Go安装包。用这个编译好的Go去编译我们需要源码安装的Go。安装前准备:go...原创 2019-06-18 00:47:49 · 4540 阅读 · 1 评论 -
Golang源码笔记--unsafe.Pointer与uintptr
最近阅读golang源码时,经常遇到unsafe.Pointer和uintptr对结构体指针做一些操作,看的有点懵,特别发了点时间研究了下,并有些心得。先看下官方定义:A pointer value of any type can be converted to a Pointer.A Pointer can be converted to a pointer value of any t...原创 2019-06-18 00:50:21 · 854 阅读 · 0 评论 -
Golang 快速删除map所有元素
1. 所有Go版本通用方法:重新申请一个新的map,旧的map交给GC去回收。a := make(map[string]int)a["a"] = 1a["b"] = 2// clear alla = make(map[string]int)2. Go 1.11版本以上用法:通过Go的内部函数mapclear方法删除。这个函数并没有显示的调用方法,当你使用for循环遍历删除所有...原创 2019-06-18 00:55:20 · 11762 阅读 · 0 评论 -
Golang汇编 中点号如何输入
先切换到中文办输入法,在按下 “~”键,即Tab正上方的键。切换到中文并输入"~"键时,会出现如下图所示的问题:这不是问题,直接按Enter键中点号就出来了。...原创 2019-07-25 20:24:06 · 344 阅读 · 0 评论 -
Golang之map tophash详解
tophash是一个长度为8的数组,它不仅仅用来存放key的哈希高8位,在不同场景下它还可以标记迁移状态,bucket是否为空等。弄懂tophash对我们深入了解map实现非常重要。如上图:每一个tophash唯一对应一个K/V对。tophash值当tophash对应的K/V被使用时,存的是key的哈希值的高8位;当tophash对应的K/V未被使用时,存的是K/V对应位置的状态。下面是...原创 2019-07-25 20:29:50 · 2914 阅读 · 4 评论 -
Golang 位运算之 &^
看Golang源代码,突然看到一个 a &^ b的位操作,有点懵,在通过不断的写测试验证,终于弄清楚了是怎么回事,在这里记录一下,避免忘记。在弄清楚a &^ b是怎么回事之前,我们先看一个我们熟悉的 a += b:a += b ==> a = a + b其实&^也是一样:a &^ b ==> a ^ (a & b)只是把 = ...原创 2019-07-25 20:32:47 · 991 阅读 · 1 评论 -
golang gccgo vs gc
GCC是一个功能强大的编译器,不仅可以编译我们很熟悉的C/C++,也可以做为Fortran、Pascal、Objective-C等语言的编译器。而GCCGO则是GCC专门用来编译Golang语言的。GC,全称Golang Compiler,是Go语言官方编译器,也是自带的,通常我们使用的go build等,就是GC。大部分人认同的比较结果:GC是Go语言原生的编译器,不需要安装,使用方使;...原创 2019-07-26 10:22:17 · 8011 阅读 · 2 评论 -
Golang map源码详解
Golang的map是用哈希表实现的,在实现性能上非常优秀,这里会主要对map创建、插入、查询、删除以及删除全部的源码做详解,刻意避开了扩容以及迭代相关的代码,后续会用一个新的文章去讲述。Golang好几个版本都对map源码进行了重构,整体逻辑变化不大,但实现细节上有很大优化,下面介绍是1.12.5版本的源码。1、名词解释对哈希桶、桶链、桶、溢出桶做一下区分,方便后面阅读。哈希桶指整个哈...原创 2019-09-06 16:51:40 · 3426 阅读 · 0 评论 -
Golang kindNoPointers标志详解
在看golang源码时,有时会判断变量类型是否为kindNoPointers,然后根据判断做出一些处理,那kindNoPointers究竟表示什么意思呢?定义@(src\runtime\typekind.go:37)kindNoPointers = 1 << 7注,在源码中多个文件都有定义kindNoPointers,但没关系,值都是1 << 7从字面上看...原创 2019-09-10 21:20:25 · 450 阅读 · 0 评论 -
Golang map之reflexivekey函数详解
定义和实现@(src/runtime/type.go:382)func (mt *maptype) reflexivekey() bool { // true if k==k for all keys return mt.flags&4 != 0}reflexive中文意思是反身的、反射性的,从注释上看是说当k==k时,表示是reflexivekey,但有字段k!=k吗?还真有...原创 2019-09-10 21:22:24 · 232 阅读 · 0 评论 -
Golang map之needkeyupdate函数详解
定义和实现@(src/runtime/type.go:385)func (mt *maptype) needkeyupdate() bool { // true if we need to update key on an overwrite return mt.flags&8 != 0}我们先看下这个函数的使用场景,在对map做插入时,当发现插入的key已经存在时,正常流程只...原创 2019-09-10 21:24:58 · 417 阅读 · 0 评论 -
Golang Vim开发环境搭建
Golang Vim开发环境搭建文章目录Golang Vim开发环境搭建1 升级vim2 安装Vundle.vim3 安装Vim-go4 安装YouCompleteMe4.1 下载4.2 相关报错4.2.1 Python headers are missing ...4.2.2 "CMAKE_CXX_COMPILER-NOTFOUND" was not found4.3 安装成功5 安装goim...原创 2019-05-08 14:06:56 · 2037 阅读 · 1 评论