
语言篇-golang
文章平均质量分 58
小豆角
一个喜欢刨根问底的程序媛
展开
-
golang-type关键字使用大全https://blog.youkuaiyun.com/wohu1104/article/details/105846539
目录1.定义结构体2.定义接口3.根据旧的类型定义新的类型类型转换4.类型别名定义5.接口类型查询1.定义结构体2.定义接口3.类型定义(函数也是类型,可以作为参数传递给别的函数)type newType Type使用类型定义定义出来的类型与原类型不相同,所以不能使用新类型变量赋值给原类型变量,除非使用强制类型转换。类型定义可以在原类型的基础上创造出新的类型。其中newType是一种新的类型,newType本身依然具备Type类型的...原创 2021-01-21 19:12:35 · 323 阅读 · 0 评论 -
golang文件读取和写入https://www.cnblogs.com/-beyond/p/9203272.html
package mainimport ( "io/ioutil" "fmt" "os" "bufio" "io")var ( filepath = "C:\\Users\\yangzhen1\\Desktop\\es10000Console_old\\src.txt" descpath = "D:\\goCodeWorkspace\\src\\github.com\\ks3sdklib\\aws-sdk-go\\test\\yz_test\\desc.t.原创 2021-01-19 10:59:39 · 288 阅读 · 0 评论 -
Golang(Go语言)中实现典型的fork调用
背景在日常的系统编程中,我们经常有这样的需求:fork多个子进程去执行任务。例如典型的master-slave架构便是这样的,fork调用之后,父进程开始作为管理进程管理子进程,而子进程则开始执行处理请求的代码。但是在Go语言中,由于Go语言屏蔽了进程、线程的概念,而只提供了goroutine的概念,导致我们无法很好的直接操作fork调用。在Go语言中,此类解决方案只有以下三种:syscall.ForkExec os.StartProcess exec.Cmd这三个都类似于f...原创 2020-05-21 17:18:24 · 2374 阅读 · 1 评论 -
golang 单例模式的几种实现
1、饿汉模式type Instance struct {}var MyInstance = &Instance{}func GetInstanc() *Instance { return MyInstance}type Instance struct {}var MyInstance *Instance//服务启动时加载func init() { MyInstance = &Instance{}}2、懒加载模式type sing原创 2020-05-19 21:13:22 · 496 阅读 · 0 评论 -
golang中interface底层分析-2-简书上的两个文章-很好
https://www.jianshu.com/p/ce91ca87fef1https://www.jianshu.com/p/917a3cf6682f原创 2020-05-19 21:02:43 · 273 阅读 · 0 评论 -
Go语言interface(接口)底层实现-1
Go的interface源码在Golang源码的runtime目录中。Go在不同版本之间的interface结构可能会有所不同,但是,整体的结构是不会改变的,此文章用的Go版本是1.11。Go的interface是由两种类型来实现的:iface和eface。其中,iface表示的是包含方法的interface,例如: type Person interface { Print() } 而eface代表的是不包含方法的interface,即type...原创 2020-05-19 21:00:19 · 514 阅读 · 0 评论 -
go的拷贝
1.go的传参全部是拷贝传参2.range出来的v也是拷贝出来修改eg:答案是1type M struct{ A int}func main(){ z := []M{{1},{2}} for _,m := range z{ if m.A==1{ m.A = 12 } } fmt.Println(z[0].A)}那么怎样才能改变slic...原创 2020-05-08 15:25:34 · 182 阅读 · 0 评论 -
一个协程池的简单实现
package mainimport ( "fmt" "time")type Task struct { f func() error}func NewTask(f func() error) *Task{ t := Task{ f: f, } return &t}func (t *Task)Run(){ t.f()}type pool stru...原创 2020-04-29 20:10:31 · 257 阅读 · 0 评论 -
slice map和chan struct make new 作为函数参数分析
go都是值传递。1.slice是个结构体,而不是一个指针,其底层实现是指向数组的指针三要素:type(指针),len,cap函数内部修改slice并不会影响外部slice。 其实go里面都是值传递,makeslice返回的是[]int,传入函数内部会对其拷贝一份,slice内部实现是指向数组的指针的,拷贝的副本部分底层实现也是指向同一内存地址的指针数组。所以内部修改slice的值是能修...原创 2020-04-29 14:30:02 · 281 阅读 · 0 评论 -
GO的调度
我是我以为我懂了先生,以为自己知道go是怎样调度的,其实深入想一下,自己不了解的太多了。就拿最广而告之的M P G来说吧。M:拥有PCB结构,在内核中有一席之地的内核级线程。tip:go之父设计线程调用时候,tcp连接参数全部都是non-block模式,注意不理解这个,有可能会线程暴涨哦~~~~非阻塞,从调用者的角度,不会阻塞自身一直等下去,倘若每一个ioRead阻塞一个M,多个netIO...原创 2020-04-29 13:21:18 · 556 阅读 · 0 评论 -
go语言中的格式占位符%集锦
这些是死知识,把常用的记住,不常用的直接查表就行了golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf。定义示例类型和变量type Human struct {Name string}var people = Human{Name:"zhangsan"}1)普通占位符占位符 说明 举例 输出 %v 相应值的...原创 2020-04-22 14:20:29 · 911 阅读 · 0 评论 -
defer链的执行顺序
defer先进后出,协程遇到panic时,遍历本协程的defer链表,并执行defer。在defer执行过程中遇到recover则停止panic,返回recover处继续往下执行,如果没有recover,遍历完本协程的defer链之后,向stderr抛出panic信息,从执行顺序看,先进后出的顺序执行。关注:defer的执行顺序,执行时参数的值,以及参数的执行顺序。之行时候参数的值斗志值拷...原创 2020-04-22 13:20:41 · 344 阅读 · 0 评论 -
golang的map
https://blog.youkuaiyun.com/u011957758/article/details/82846609前言前段时间听了大佬们对于map的讲解,结合自己之前的积累,专门来由浅入深的总结一下,希望可以与map之间做一个了断。文章的深浅顺序是递进的,当你看完这篇文章,你也基本掌握了map的99%的知识点了,可以装逼和吹牛逼了。正文1.map的基本使用1.1声明 &...原创 2020-04-07 15:53:45 · 292 阅读 · 0 评论 -
go程泄露
https://www.zhihu.com/collection/399256772 知乎go程泄露引自阿里面试多个go程向一个无缓冲channel发送数据,其中一个go程未抢到,是否会泄露。https://blog.youkuaiyun.com/qq_33296108/article/details/82731686 channel关闭的方式实现两个Goroutine通信,要求如下:(...原创 2020-03-26 15:28:27 · 231 阅读 · 0 评论 -
golang正则
1.验证是否匹配正则;package libimport ( "regexp")func IsEmail(email string) bool { if email != "" { if isOk, _ := regexp.MatchString("^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9...原创 2019-10-25 22:19:01 · 178 阅读 · 1 评论 -
几个小tip
1. 2 << 5 等于 2 * 2^5 左移一次就是乘以22. slice := make([]int,1024,1024) 这种做法很蠢,因为设置1024个 长度,一旦append 就会在1025个数据之后往后追加了。我们使用slice经常使用追加操作。3.slice[1:5] 这种截取是左闭右开,index为1和4的会被切进来4.什么时候让出go程...原创 2019-06-24 10:06:00 · 883 阅读 · 0 评论 -
golang的运算符https://studygolang.com/articles/12463
前言:运算符优先级,是描述在计算机运算计算表达式时执行运算的先后顺序。 先执行具有较高优先级的运算,然后执行较低优先级的运算。一、算数运算符下表列出了所有Go语言的算术运算符。假定 A 值为 10,B 值为 20。运算符 描述 实例 ...转载 2019-06-15 12:55:40 · 359 阅读 · 0 评论 -
图解Golang的内存分配https://mp.weixin.qq.com/s/pbwCYFEESkILGIJVqnNaLA
一般程序的内存分配在讲Golang的内存分配之前,让我们先来看看一般程序的内存分布情况:以上是程序内存的逻辑分类情况。我们再来看看一般程序的内存的真实(真实逻辑)图:Go的内存分配核心思想Go是内置运行时的编程语言(runtime),像这种内置运行时的编程语言通常会抛弃传统的内存分配方式,改为自己管理。这样可以完成类似预分配、内存池等操作,以避开系统调用带来的性能问题,...转载 2019-06-12 12:32:28 · 773 阅读 · 0 评论 -
图解Go语言内存分配 https://juejin.im/post/5c888a79e51d456ed11955a8
图解Go语言内存分配Go语言内置运行时(就是runtime),抛弃了传统的内存分配方式,改为自主管理。这样可以自主地实现更好的内存使用模式,比如内存池、预分配等等。这样,不会每次内存分配都需要进行系统调用。Golang运行时的内存分配算法主要源自 Google 为 C 语言开发的TCMalloc算法,全称Thread-Caching Malloc。核心思想就是把内存分为多级管理,从而降低锁...转载 2019-06-12 12:31:27 · 483 阅读 · 0 评论 -
简单易懂的 Go 内存分配原理解读 https://yq.aliyun.com/articles/652551
1. 前言编写过C语言程序的肯定知道通过malloc()方法动态申请内存,其中内存分配器使用的是glibc提供的ptmalloc2。除了glibc,业界比较出名的内存分配器有Google的tcmalloc和Facebook的jemalloc。二者在避免内存碎片和性能上均比glic有比较大的优势,在多线程环境中效果更明显。Golang中也实现了内存分配器,原理与tcmalloc类似,简单的...转载 2019-06-12 12:29:13 · 370 阅读 · 0 评论 -
程序在内存中的分布
zz:https://www.cnblogs.com/Lynn-Zhang/p/5449199.html代码段(.text),也称文本段(Text Segment),存放着程序的机器码和只读数据,可执行指令就是从这里取得的。如果可能,系统会安排好相同程序的多个运行实体共享这些实例代码。这个段在内存中一般被标记为只读,任何对该区的写操作都会导致段错误(Segmentation Fault)。...原创 2019-06-12 12:26:51 · 194 阅读 · 0 评论 -
从内存分配谈起
来自:https://mp.weixin.qq.com/s/EyWKFRu1xryoHY386QUcuA在步入正题之前,先声明一下,本公众号面向的是有一定基础的开发者,不过田老师会尽可能的用浅显易懂的语言把一些重要的、常用的技术点深入浅出的讲解出来,愿大家阅读、分享、共同学习,共同提高。言归正传,大家在平时的开发过程中,发生内存错误是件非常麻烦的事情,编译器不能自动发现这...转载 2019-06-12 12:23:14 · 188 阅读 · 0 评论 -
译文:Go 内存分配器可视化指南
当我第一次开始尝试理解 Go 语言的内存分配器时,整个过程让我抓狂。一切看起来都像一个神秘的黑盒子。因为几乎所有技术魔法(technical wizardry)都隐藏在抽象之下,所以你需要一层一层的剥离才能去理解它。我们将通过这篇文章来一层层的剥离这些细节。如果你想学习所有关于 Go 内存分配器的知识,那么这篇文章正适合你。物理内存和虚拟内存每一个内存分配器都需要运行在由底层操作系统管...转载 2019-06-12 12:21:22 · 333 阅读 · 0 评论 -
Go语言内存分配
【简单易懂,非常清晰】https://yq.aliyun.com/articles/652551【内存分配器的初始化过程,分配流程图很详细】https://www.jianshu.com/p/47691d870756【全局的图】https://swanspouse.github.io/2018/08/22/golang-memory-model/【雨痕 Go1.5源码阅读】https:...转载 2019-06-03 21:33:48 · 497 阅读 · 0 评论 -
从源码角度看 Golang 的调度
目录▍简单概念▍调度器的三个抽象概念:G、M、P▍调度的大致轮廓下面从程序启动、调度循环、G的来源三个角度分析调度的实现。▍进程启动时都做了什么?▍runtime.osinit(SB)方法针对系统环境的初始化▍runtime.schedinit(SB)调度相关的一些初始化▍runtime·mainPC(SB)启动监控任务▍最后 runtime·mstart(...转载 2019-06-03 14:11:33 · 376 阅读 · 0 评论 -
golang随机数生成以及time包使用
正确使用Go的Timer我们总是会使用Timer去执行一些定时任务,最近在Go语言的定时器使用上面不小心踩到一点问题,这里记录一下。go demo(input)func demo(input chan interface{}) {for {select {case msg <- input:pr...转载 2019-06-01 20:23:18 · 2002 阅读 · 0 评论 -
golang屏蔽信号
package mainimport ( "fmt" "os" "os/signal")func main() { go func() { for i:=0;i<=100;i++ { fmt.Println("i am test") } }() //阻塞 c := make(chan os.Signal, 1) //当前对os.Kill 和...原创 2019-06-01 20:04:15 · 737 阅读 · 0 评论 -
GDB工具分析golang源码
整体引导顺序:line 8根据:asm_amd64.s文件的内容,以下go文件被顺序调用:先call一些初始化,最后调用runtime的main。在runtime.main() 中:执行栈最大限制,启动垃圾回收,执行runtime包内所有初始化init,启动垃圾回收后台操作,执行所有的用户包,包括标准库,的初始化init,执行用户逻辑入口main.main函数。执行结束,返回退出状...原创 2019-05-27 19:21:08 · 572 阅读 · 0 评论 -
接口-话接口
因为继承不灵活,对于结构体,扩充已有类型,可以定义别名和使用组合;比如beego中自定义的controller就是定义别名1.duck typing的概念,鸭子类型2.为什么要有接口:解耦3.go语言的接口中只有方法,没有变量,但是可以直接放类型,就是实现了另外一个接口,也可以把接口类型 看成一个 类 只是没有属性,只有方法;4.接口类型不可以实例化,只有struct才可以实例...原创 2019-05-22 14:15:28 · 307 阅读 · 0 评论 -
Golang Printf、Sprintf 、Fprintf 格式化
1.`Sprintf` 则格式化并返回一个字 符串而不带任何输出。s := fmt.Sprintf("是字符串 %s ","string")2.fmt.Println(s)// 是字符串 %s 对应 是字符串 string3.可以使用 `Fprintf` 来格式化并输出fmt.Fprintf(os.Stderr,"格式化 %s\n","error")顺...原创 2019-05-15 18:51:17 · 5380 阅读 · 0 评论 -
Go语言 Google资深工程师深度讲解
1.扩充已有包:为结构定义的方法必须放在同一个包内,但是可以是不同的文件。定义别名:type S struct {B//类型B}使用组合type A struct {BC}2.常用接口fmt包的Stringer 以及io包的Reder Writer3.map的key不可以是slice map function float 或者含有这些类型的...原创 2019-05-12 09:19:52 · 599 阅读 · 0 评论 -
go中interface的实现类型之值传递
package mainimport "fmt"type iread interface { mread() string}type iwrite interface { mwrite(path string)}type irw interface { iread iwrite}type file struct { path string}func (f f...原创 2019-04-28 23:17:55 · 1460 阅读 · 0 评论 -
go实现go程池https://www.jianshu.com/p/508f5d3b2f59
https://www.cnblogs.com/williamjie/p/9267741.html 牛的很,poolpackage mainimport ( "fmt" "time")/* 有关Task任务相关定义及操作 *///定义任务Task类型,每一个任务Task都可以抽象成一个函数type Task struct { f func() error //一...转载 2019-04-26 20:29:11 · 817 阅读 · 0 评论 -
!!!!!!go中管道的理解之---遍历管道+管道关闭+select=====三种断言方式
1.管道遍历有3种方式见下贴图每种方式都要求没有数据的时候,管道是关闭的,不然试图读取空管道会panic遍历的本质-循环-go中只有for: [要遍历的对象]+ [遍历出来的东西存放的容器]+ [ 遍历的 条件]这三种方式,遍历1个管道,我推荐1,一个for中同时遍历多个管道,并使用,我推荐3,好像也只能使用3吧。当然方式1,2也可以在for外部构建一个容器,每次把每层循环的数据倒...原创 2019-04-26 13:27:49 · 2593 阅读 · 0 评论 -
go中管道的理解之---管道作为函数返回值
====描述有误,回头再修改,不要在看了==========go语言channel的作用:同步和通信,也就是通信吧。【管道可以实现go程之间的通信和同步,一个go去send,另外的go去receive,附带赠送功能----也可以实现桢之间的同步,一个桢receive,一个桢send,简言之:桢返回管道被使用,桢就可以活着了】因为管道实现的是go之间的桥梁,所以,只要出现chann...原创 2019-04-26 11:53:51 · 1861 阅读 · 0 评论 -
golang小贴士
1.slice 是对底层数组的一个视窗,slice[:2] 这个视窗除了len其余和原slice相同,也就是说 ptr和cap都相同slice[2:]这个视窗,和原slice的ptr相同,len不同了,cap也不同了,比原来少了2个。slice只有在超过cap的时候才扩容,产生一个新的切片。2.map【map的key不可以是slice map fun类型,或者含有这些类型的结构体...原创 2019-04-24 21:07:48 · 134 阅读 · 0 评论 -
反射之自我探索-比较乱
https://studygolang.com/articles/2157好的反射文章https://mp.weixin.qq.com/s/ndOAUNRxwMmbCfNssUK4sg反射提供了一种通过镜子窥私的方式,直接窥探的是编译器编译的那段代码:类型啦,值啦,这两块东西。我认为反射就像一面镜子,镜子前面站着一个接口类型的变量,经过反射,镜子后面照出了这个变量里的一对信息:val...原创 2019-04-10 21:33:55 · 121 阅读 · 0 评论 -
go语言反射-By Rob Pike
##介绍反射在计算机的概念里是指一段程序审查自身结构的能力,主要通过类型进行审查。它是元编程的一种形式,同样也是引起混乱的重大来源。在这篇文章里我们试图阐明Go语言中的反射是如何工作的。每种语言的反射模型是不同的(许多语言不支持反射),然而本文只与Go有关,所以我们接下来所提到的“反射”都是指Go语言中的反射。##类型与接口由于反射是建立在类型系统(type system)上的,所...转载 2019-04-10 21:25:13 · 265 阅读 · 0 评论 -
go的delve工具调试
https://yq.aliyun.com/articles/57578https://www.cnblogs.com/li-peng/p/8522592.html=================================================================================追踪代码中的错误可能是一件非常头疼的事情。这在高度依赖goro...转载 2019-04-09 14:56:06 · 917 阅读 · 0 评论 -
使用go的基准测试工具
基准测试,测试解决同一问题不同方案的性能。识别cpu和内存使用过的效率。测试文件名必须以_test.go结尾,并且导入testing包,基准测试函数必须以Benchmark开头。基准测试框架默认会在持续1秒的时间内,反复调用测试的函数,要测试的函数写在测试函数逇for循环体内。go test -v -run="none" -bench=. -benchmem============...原创 2019-04-08 20:39:06 · 276 阅读 · 0 评论