go 基础
文章平均质量分 73
go 基础
go&Python
开发转运维(devops,prometheus)中(暂时中止),js/app逆向(进度50%),还想写go(后面再学一遍吧)。目标不大,路在脚下
展开
-
go map 底层实现原理
获取哈希值的tophash(哈希值的前8位),将tophash、key、value 分别写入如到桶中的三个数组中。如果是翻倍扩容,那么迁移就是将旧桶中的数据分流至新的两个桶中(比例不定),并且桶编号的位置为: 同编号位置 和 翻倍后对应的编号位置。注意: 同一个桶中key的哈希值的低B位一定时相同的,不然不会放到同一个桶中,所以同一个桶中黄色标记的位都是相同的。迁移时会遍历某个旧桶中所有的key(包括溢出桶),并根据key重新生成哈希值,根据哈希值的。原创 2022-10-24 18:01:31 · 505 阅读 · 0 评论 -
go strings 包
标准库strings用于处理utf-8编码的字符串,字符串的操作,通过该标准库。原创 2022-08-11 12:54:02 · 227 阅读 · 0 评论 -
go path/filepath 包
filepath 包实现了兼容各操作系统的文件路径操作函数。path实现了对斜杠分隔的路径进行操作的函数。原创 2022-08-11 12:46:47 · 254 阅读 · 0 评论 -
go 反射 reflect 包
反射就是程序能够在运行时检查变量和值,求出它们的类型反射就是在运行时动态的获取一个变量的类型信息和值信息反射是指在程序运行期对程序本身进行访问和修改的能力。程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。支持反射的语言可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们。...原创 2022-08-02 17:52:32 · 562 阅读 · 0 评论 -
go log包
Go语言内置的log包实现了简单的日志服务。zap、logrus等log包定义了Logger类型,该类型提供了一些格式化输出的方法musync.Mutex//mu属性主要是为了确保原子操作prefixstring//prefix设置每一行的前缀flagint//flag设置输出的各种属性,比如时间、行号、文件路径等outio.Writer//out输出的方向,用于把日志存储文件buf[]byte//缓冲}、Fatal系列、和Panic系列。......原创 2022-07-22 15:08:06 · 515 阅读 · 0 评论 -
go IO操作-文件读
文件读取是所有编程语言中最常见的操作之一。我们会学习如何使用Go读取文件。使用File自带的Read方法,使用os.Open()或打开文件(Open本质还是调用了OpenFile)使用bufio库的Read方法,使用r(文件对象),也需要先打开文件使用io/ioutil库的ReadAll(),使用(文件路径),本质还是调用了bufio>>File自带Read模式含义只写创建文件只读os.O_RDWR读写os.O_TRUNC清空追加。...原创 2022-07-22 15:47:09 · 855 阅读 · 0 评论 -
go IO操作-文件写
模式含义只写创建文件只读os.O_RDWR读写os.O_TRUNC清空追加。原创 2022-07-22 16:05:34 · 896 阅读 · 0 评论 -
go exec 包
有时候我们的go程序需要执行外部的命令,比如执行linuxshell命令,一个其他语言编写的二进制文件,我们都可以通过调用go语言的exec包的函数来执行。原创 2022-08-01 16:51:38 · 724 阅读 · 0 评论 -
go os 包
os包提供了不依赖平台的操作系统函数接口。错误处理设计为go风格,失败的调用会返回错误值而非错误码。通常错误值里包含更多信息。原创 2022-08-01 17:08:53 · 563 阅读 · 0 评论 -
go 序列化与反序列化
如果一个JSON值不匹配给出的目标类型,或者如果一个json数字写入目标类型时溢出,Unmarshal函数会跳过该字段并尽量完成其余的解码操作。JSON的null值解码为go的接口、指针、切片时会将它们设为nil,因为null在json里一般表示“不存在”。要将json数据解码写入一个结构体,函数会匹配输入对象的键和Marshal使用的键(结构体字段名或者它的标签指定的键名),优先选择精确的匹配,但也接受大小写不敏感的匹配。接口类型的值编码为接口内保持的具体类型的值(的json编码)。......原创 2022-08-01 15:57:55 · 1318 阅读 · 0 评论 -
go rand 包
在Golang中,有两个包提供了rand,分别为“math/rand”和“crypto/rand”,对应两种应用场景“math/rand”包实现了伪随机数生成器。也就是生成整形和浮点型“crypto/rand”包实现了用于加解密的更安全的随机数生成器。...原创 2022-08-01 16:18:18 · 1004 阅读 · 0 评论 -
go context 包
Context,翻译为"上下文",context包定义了Context接口类型,其接口方法定义了跨API和进程之间的执行最后期限、取消信号和其他请求范围的值在并发程序中,由于超时、取消操作或者一些异常情况,往往需要进行抢占操作或者中断后续操作,他的底层是通过channel去传递管理信号。例如,父goroutine可以传递一个close信号来关闭此channel,子goroutine通过监听这个channel,那么子goroutine也会退出。......原创 2022-08-02 14:58:56 · 733 阅读 · 0 评论 -
go strconv 包
go语言不支持进行隐式的类型转换,只能手动去执行显性转换操作转换数据类型的方式很简单。//浮点数a=5.0//转换为int类型b=int(a)Go允许在底层结构相同的两个类型之间互转。//MyInt类型的底层是int类型typeMyIntint//a的类型为MyInt,底层是intvaraMyInt=5//将a(MyInt)转换为int,b现在是int类型b=int(5)//将b(int)转换为MyInt,c现在是MyInt类型cstrconv。......原创 2022-07-22 14:28:44 · 300 阅读 · 0 评论 -
go errors
只要实现了error接口中的Error方法,就叫实现该接口,就是我们自定义的错误return"出现错误,错误原因为radius"半径不能小于0",}}return3.14*radius*radius,nil}funcmain(){=nil{fmt.Println("圆的面积为",res)}}原创 2022-07-22 13:48:16 · 385 阅读 · 0 评论 -
go 并发编程之-工作池
缓冲信道的重要应用之一就是实现工作池。工作池就是一组等待任务分配的线程。一旦完成了所分配的任务,这些线程可继续等待任务的分配,和python中的进程池,线程池一样。我们会使用缓冲信道来实现工作池。我们工作池的任务是计算所输入数字的每一位的和。例如,如果输入234,结果会是9(即2+3+4)。向工作池输入的是一列伪随机数。创建一个Go协程池,监听一个等待作业分配的输入型缓冲信道。将作业添加到该输入型缓冲信道中。作业完成后,再将结果写入一个输出型缓冲信道。...原创 2022-07-21 17:53:38 · 440 阅读 · 0 评论 -
go flag包
开发命令行程序时,经常需要接受命令行传入的参数如这种运行程序时,传入参数,app.exe-name=lxxage=99flag包提供了参数处理的功能,官方文档地址https。原创 2022-07-20 16:27:10 · 877 阅读 · 0 评论 -
并发模型值Actor和CSP
CSP的是(CSP)的缩写,翻译成中文是顺序通信进程,简称CSP的核心思想是多个线程之间通过Channel来通信,对应到golang中的chan结构,对应到Python中是QueueGo语言的CSP模型是由协程Goroutine与通道ChannelGo协程goroutine是一种轻量线程,它不是操作系统的线程,而是将一个操作系统线程分段使用,通过调度器实现协作式调度。是一种绿色线程,微线程,它与Coroutine协程也有区别,能够在发现堵塞后启动新的微线程。通道channel类似Unix的Pipe。....原创 2022-07-20 16:13:30 · 302 阅读 · 0 评论 -
go fmt包详解
系列函数都支持format格式化参数,在这里我们按照占位符将被替换的变量类型划分,方便查询和记忆。为输入数据指定了具体的输入内容格式,只有按照格式输入数据才会被扫描并存入对应变量。有时候我们想完整获取输入的内容,而输入的内容可能包含空格,这种情况下可以使用。从标准输入中扫描用户输入的数据,将以空白符分隔的数据分别存入指定的参数。将上面的代码编译后在终端执行,在终端按照指定的格式依次输入。三个函数,可以在程序运行过程中从标准输入获取用户的输入。例如,我们还是按照上个示例中以空格分隔的方式输入,......原创 2022-07-20 16:08:42 · 1737 阅读 · 0 评论 -
go GMP模型
操作系统的线程会被操作系统内核调度时会挂起当前执行的线程并将它的寄存器内容保存到内存中,选出下一次要执行的线程并从内存中恢复该线程的寄存器信息,然后恢复执行该线程的现场并开始执行线程。从一个线程切换到另一个线程需要完整的上下文切换。因为可能需要多次内存访问,索引这个切换上下文的操作开销较大,会增加运行的cpu周期。区别于操作系统内核调度操作系统线程,goroutine的调度是Go语言运行时(runtime)层面的实现,是完全由Go语言本身实现的一套调度系统——。它的作用是按照一定的规则将所有的GPM。...原创 2022-07-19 18:20:14 · 340 阅读 · 0 评论 -
go 原子操作
代码中的加锁操作因为涉及内核态的上下文切换会比较耗时、代价比较高。针对基本数据类型我们还可以使用原子操作来保证并发安全,因为原子操作是Go语言提供的方法它在用户态就可以完成,因此性能比加锁操作更好。Go语言中原子操作由内置的标准库sync/atomic提供。......原创 2022-07-19 18:13:07 · 263 阅读 · 0 评论 -
go sync包
互斥锁是完全互斥的,但是有很多实际的场景下是读多写少的,当我们并发的去读取一个资源不涉及资源修改的时候是没有必要加锁的,这种场景下使用读写锁是更好的一种选择。在代码中生硬的使用time.Sleep肯定是不合适的,Go语言中可以使用sync.WaitGroup来实现并发任务的同步。上面的代码中我们开启了两个goroutine去累加变量x的值,这两个goroutine在访问和修改x变量的时候就会存在数据竞争,导致最后的结果与期待的不符。之间的代码,都只能由一个Go协程执行,于是就可以避免竞态条件。...原创 2022-07-19 17:47:26 · 441 阅读 · 0 评论 -
go 多路复用
代码块中加入default后,因为case都没有准备就绪,因此会直接执行default下的代码块。我们在前面已经知道,除非有case执行,select语句就会一直阻塞着。等待信道中传递过来值,一旦其中一个信道接收到值就会运行case下的代码块。语句会一直阻塞,直到发送/接收操作准备就绪。如果有多个信道操作准备完毕,所以,多次运行,结果不会一模一样,如果是同时多个信道中接收到值,会。语句没有任何case,因此它会一直阻塞,导致死锁。类似,所不同的是,这里的每个。的信道,也同样会执行默认情况。...原创 2022-07-19 16:30:32 · 652 阅读 · 0 评论 -
go 常用标准库之-time
时间戳是自1970年1月1日(080000GMT)计算机与阿年,至当前时间的总毫秒数。如果结果超出了Duration可以表示的最大值/最小值,将返回最大值/最小值。判断两个时间是否相同,会考虑时区的影响,因此不同时区标准的时间也可以正确比较。包定义的一个类型,它代表两个时间点之间经过的时间,以纳秒为单位。函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息。进行格式化,需要注意的是Go语言中格式化时间模板不是常见的。如果t代表的时间点在u之前,返回真;如果t代表的时间点在u之后,返回真;...原创 2022-07-19 10:34:50 · 437 阅读 · 0 评论 -
go Timer
go的Timer包也称作是并发编程的计时器,是time包下用来执行延迟任务和定时任务的功能部分,由于机制的原因导致在并发编程中容易出现错误或者bug,但是只要了解清楚了其工作原理,就知道如何避免产生错误了。.........原创 2022-07-19 10:26:51 · 624 阅读 · 0 评论 -
go runtime 包
虽然Go编译器产生的是本地可执行代码,但是这些代码仍旧运行在Go的runtime(这部分的代码可以在runtime包中找到)当中。Go的运行时,可以通过runtime包中的函数,设置go运行时的环境,比如运行最大有多少逻辑处理器§,最多可以创建多少OS线程(M)等。...原创 2022-07-18 17:36:51 · 659 阅读 · 0 评论 -
go panic 与 recover
go 不像python一样,有 try-except语法,同样也不推荐异常捕获的方式,而是直接将异常返回的方式,并且直接退出也会比层层返回方便的多。因此go中实现了 panic- recover 机制。专门用于对这些异常进行抛出和恢复。但是 在 go 中更推荐使用 错误类型,而不是 使用 panic 和 recover。只有当程序不能继续运行时,才应该使用panic-recover机制。panic 用于主动抛异常,类似于python 中的 raisepanic 有两个合理的用例。发生了一个不能恢复的错误,原创 2022-07-13 13:21:47 · 455 阅读 · 0 评论 -
go WaitGroup与defer
是一个结构体类型,用于等待一批Go协程执行结束。程序会一直阻塞,直到这些协程全部执行完毕。主线程(goroutine)才会执行通过前面信道一文,我们可以利用信道实现和一样的效果。代码如下:可以看出,等待5个子执行,代码就有一丢丢复杂了,如果要等待更多,代码量虽然不会增加,但是 信道的容量确需要 变化。接下来我们看看使用 实现的代码。可以看出,使用,代码就简单很多了,多一个子goroutine,只需要多启动一个任务即可。 语句的用途是:含有 语句的函数,会在该函数将要返回之前,调用另一个函数。这个定义可原创 2022-07-13 09:42:25 · 296 阅读 · 0 评论 -
go 信道
信道可以想像成 Go 协程之间通信的管道。如同管道中的水会从一端流到另一端,通过使用信道,数据也可以从一端发送,在另一端接收。信道在go中算是一种特殊类型,所有信道都关联了一个类型。信道只能运输这种类型的数据,而运输其他类型的数据都是非法的。 表示 类型的信道。信道的零值为 。信道的零值没有什么用,所以可以 map 和切片所做的那样,用 来定义信道。信道的使用信道的使用很简单,如下所以可以通过信道发送和接收数据信道旁的箭头方向指定了是发送数据还是接收数据。在第一行,箭头对于 来说是向外指的,因此原创 2022-07-12 17:02:19 · 442 阅读 · 0 评论 -
go 协程
并发:并发是指立即处理多个任务的能力,在一个时间段内,可以进行多个任务(干多个活),单核cpu,多个任务执行,只能每个任务执行一会,这就是并发并行:并行指的是同时处理多个任务,在同一时刻,可以进行多个任务,必须有多个cpu的支持但是到了go语言中,不存在这个问题,go中没有进程,线程的概念,通通称为协程。go中开多个协程,既能实现单线程下的并发,又能够很好的利用多核优势。go 协程是与其他函数或方法一起并发运行的函数或方法。go 协程可以看作是轻量级线程。与线程相比,创建一个 go 协程的成本很小。因此在原创 2022-07-11 22:30:09 · 680 阅读 · 2 评论 -
go 接口高级
在接口基础部分,我们使用的都是值接受者来实现接口。同样,还可以使用指针接受者来实现接口,不过在使用指针接受者来实现接口时,还有一些细节需要注意。实现多个接口类型可以实现多个接口。类型TDuck同时实现了Animal和Duck接口,因此TDuck类型的对象能具备所有实现的方法和属性,而接口对象只能执行其对应的方法。也因为这一特性,不同的函数,可以接收的类型不一样,但是都能传同一个具体的类型,那肯定是因为这个具体的类型,实现了多个接口尽管 Go 语言没有提供继承机制,但可以通过嵌套其他的接口,创建一个新接原创 2022-07-11 21:26:07 · 125 阅读 · 0 评论 -
go 接口基础
在面向对象的领域里,接口一般这样定义:接口定义一个对象的行为。接口只指定了对象应该做什么,至于如何实现这个行为(即实现细节),则由对象本身去确定。在 Go 语言中,接口就是方法签名(Method Signature)的集合。当一个类型定义了接口中的所有方法,我们称它实现了该接口。这与面向对象编程(OOP)的说法很类似。接口指定了一个类型应该具有的方法,并由该类型决定如何实现这些方法。以python中鸭子类型为例: 类中如果有鸭子的走路的方法,鸭子说话的方法,无论你是什么类,你都是鸭子这种类型。通俗点说:不原创 2022-07-11 14:12:10 · 372 阅读 · 3 评论 -
go 方法
方法其实就是一个函数,在 这个关键字和方法名中间加入了一个特殊的接收器类型。接收器可以是结构体类型或者是非结构体类型。接收器是可以在方法的内部访问的。在其他语言中,方法是绑定给对象的,在go语言中,方法是绑定给结构体的。下面就是创建一个方法的语法。示例:方法和函数的区别方法可以看作是特殊的函数,绑定在了结构体上,方法能实现的,使用函数也能实现,但是方法能够把结构体对象自动传入,而函数需要什么参数全都得传,所以方法相比于函数,使用起来更方便有了结构体,有了方法等同于面向对象中 类与对象 能够使用原创 2022-07-06 16:38:10 · 364 阅读 · 3 评论 -
go 结构体
结构体是用户定义的类型,表示若干个字段(Field)的集合。有时应该把数据整合在一起,而不是让这些数据没有联系。这种情况下可以使用结构体(如果学过python,java的同学,可以把结构体当作类来看)例如一个人有姓名,年龄,性别三个属性,把这个属性放在结构体Person中,代码如下:结构体的初始化我们定义了一个结构体之后,也需要初始化结构,下面介绍三种结构体的初始化方案,结构体的使用定义完之后就是怎么使用,和python一样,通过 点号操作符 用于访问结构体的字段和方法匿名结构体匿名结构体指定原创 2022-07-06 10:42:34 · 205 阅读 · 0 评论 -
go 指针
指针是一种存储变量内存地址(Memory Address)的变量。在学习指针之前,建议先记住下面3句话。1. 类型前放 * 表示指针类型,这个类型的指针,指向这个类型的指针2. 在变量前加 & 取地址符号,表示取该变量的地址3. 在(指针)变量前加 * 表示反解,把地址解析成具体的值指针变量的类型为 *T,该指针指向一个 T 类型的变量。指针的零值与解引用指针是引用类型,在go中,所有引用类型的零值都为 nil指针的解引用可以获取指针所指向的变量的值。将 解引用的语法是 。指针也是一个变量,因原创 2022-07-04 18:05:07 · 511 阅读 · 0 评论 -
go 字符串操作
Go 语言中的字符串是一个字节切片。把内容放在双引号””之间,并且Go 中的字符串是兼容 Unicode 编码的,并且使用 UTF-8 进行编码。由于字符串是一个字节切片,所以我们可以获取字符串的每一个字节。runefor 循环字符串,默认是一个字节一个字节循环,但我们的中文是采用3个字节对应一个汉字,因此,直接循环中文,就会导致显示乱码因此,当字符串中出现中文时,为防止乱码现象,可以将字符串做成 rune(int32) 的切片去 for 循环byte切片和rune切片构建字符串既然 go 底层存原创 2022-07-04 16:46:53 · 680 阅读 · 0 评论 -
go 分支与循环
go 的 if-else 判断语句,和js很像,语法如下当 condition 满足条件就执行 { } 中的代码,不满足就执行 else 后面for 循环语句 是 Go 语言唯一的循环语句。Go 语言中并没有其他语言比如 python 中的 while 循环。完整的 for 循环 语法初始化语句只执行一次。循环初始化后,将检查循环条件。如果条件的计算结果为 ,则 内的循环体将执行,接着执行 post 语句。post 语句将在每次成功循环迭代后执行。在执行 post 语句后,条件将被再次检查。如果原创 2022-07-01 17:46:11 · 161 阅读 · 0 评论 -
go 函数
函数是一块执行特定任务的代码。一个函数是在输入源基础上,通过执行一系列的算法,生成预期的输出。在go语言中,函数是第一等公民,这点同python一样,都可以把函数当做变量值使用函数中的参数列表和返回值并非是必须的定义函数的基础语法如下:当函数需要参数时,应定义好参数的类型,并且只能按位置传参,没有python的关键字参数当函数有放回值时,应提前定义好返回值的类型,并且支持多返回值,并且调用函数必须接收改返回值空白符_ 在 Go 中被用作空白符,可以用作表示任何类型的任何值,作用同python中一样。原创 2022-06-28 18:07:52 · 330 阅读 · 0 评论 -
go 数组与切片
数组是同一类型元素的集合,类似于python中的集合类型。但是Go 语言中不允许混合不同类型的元素,例如包含字符串和整数的数组。(当然,如果是 interface{} 类型数组,可以包含任意类型)一个数组的表示形式为 。 表示数组中元素的数量, 代表每个元素的类型。元素的数量 也是该类型的一部分,在定义式,数组的大小就固定了,并且不能修改go 的值类型与引用类型数组的修改与循环多维数据多维数据,简单点说就是数据套数据,跟python中的列表类型一样,可以无限嵌套,这里仅以2层为例切片切片是由数组原创 2022-07-02 16:47:38 · 560 阅读 · 0 评论 -
go map
map 是在 Go 中将值(value)与键(key)关联的内置类型。通过相应的键可以获取到值(字典类型)2value值可以任意,但是go中value值必须都一致,key值只能用数字,字符串,布尔,key值也固定。map的使用基本使用,除了限制多了点,和python字典类型差不多go删除值,只能通过内置函数,并且只能根据key删除补充知识:...原创 2022-07-02 17:40:42 · 1127 阅读 · 0 评论 -
go 包的使用
在工程化的Go语言开发项目中,Go语言的源码复用是建立在包(package)基础之上的。是多个Go源码的集合,是一种高级的代码复用方案,Go语言为我们提供了很多内置包,如、、等。包能够便于我们组织代码,将同一个类型代码写在一个包下,能够便于管理。一个包可以简单的理解为一个存放 .go 文件的文件夹,该文件夹下所有的go文件,都需要在代码的第一行添加如下代码,声明该文件归属于那个包。注意事项:如果想在一个包中引用另外一个包里的标识符(如变量、常量、类型、函数等)时,该标识符必须是对外可见的(public)。原创 2022-06-30 17:32:14 · 488 阅读 · 0 评论