
Golang
文章平均质量分 87
cbmljs
这个作者很懒,什么都没留下…
展开
-
Go gcflags/ldflags 的说明
通常一起使用,用来减少可执行文件的体积。但删除了调试信息后,可执行文件将无法使用 gdb/dlv 调试。arg list 是空格分割的编译选项,如果编译选项中含有空格,可以使用引号包起来。调试,因为找不到代码的符号信息。go build 时可以使用。更多的模式的说明请参考。运行的进程,也无法用。转载 2023-01-16 19:54:38 · 3217 阅读 · 0 评论 -
Go 函数调用 ━ 栈和寄存器视角
Go 语言完全使用栈来传递参数和返回值并由调用者负责清栈,通过栈传递返回值使得Go函数能支持多返回值,调用者清栈则可以实现可变参数的函数.Go 使用值传递的模式传递参数,因此传递数组和结构体时,应该尽量使用指针作为参数来避免大量数据拷贝从而提升性能.Go 方法调用的时候是将接收者作为参数传递给了callee,接收者分值接收者和指针接收者.转载 2023-01-06 15:08:09 · 474 阅读 · 0 评论 -
深入 Go 语言 defer 实现原理
GO栈帧,汇编转载 2023-01-05 20:23:36 · 172 阅读 · 0 评论 -
golang interface内部结构的一个面试考点
关于interface的源码问题,这里举一个例子说明一下,代码如下package mainimport ( "fmt")type People interface { Show()}type Student struct{}func (stu *Student) Show() {}func live() People { var stu *Student ...原创 2019-12-03 17:41:44 · 693 阅读 · 0 评论 -
golang学习--关于defer的执行顺序
实例一、package mainimport ( "fmt")func main() { defer_call()}func defer_call() { defer func() { fmt.Println("打印前") }() defer func() { fmt.Println("打印中") }() defer func() { ...原创 2019-12-03 17:18:16 · 2736 阅读 · 0 评论 -
Go 语言闭包详解
Go 语言闭包详解原文链接:Go 语言闭包详解前言Go 语言闭包详解什么是闭包?闭包是由函数和与其相关的引用环境组合而成的实体。下面就来通过几个例子来说明 Go 语言中的闭包以及由闭包引用产生的问题。函数变量(函数值)在说明闭包之前,先来了解一下什么是函数变量。在 Go 语言中,函数被看作是第一类值,这意味着函数像变量一样,有类型、有值,其他普通变量...转载 2019-12-02 17:56:39 · 572 阅读 · 0 评论 -
go语言学习笔记--基本类型和运算符
1. 常量:常量的定义格式: const identifier [type] = value2. 变量:声明变量形式:var identifier type错误使用:var a := 233. init函数:变量可以在全局声明中初始化,也可以在init函数中初始化。不能为人调用,而是在每个包完成初始化后自动执行,并且执行优先级比main函数高。每个源文件可以包含一个或多个in...原创 2018-10-09 15:30:41 · 229 阅读 · 0 评论 -
Go语言学习笔记--strings和strconv包
前缀和后缀; strings.HasPrefix(s, prefix string) bool strings.HasSuffix(s, suffix string) bool 字符串包含关系: strings.Contains(s, substr string) bool 子串索引: Index返回字符串str在字符串s中的索引(str的第一个字符的索引) -1表示字符...原创 2018-09-04 13:36:10 · 979 阅读 · 0 评论 -
Go语言学习笔记--控制结构
If-else结构:即使当前代码块之间只有一条语句时,大括号也不可被省略 关键字if和else之后的左大括号{必须和关键字在同一行,如果你使用了else-if结构,则前段代码的又大括号必须和else-if关键字在同一行。 可以再if后面加上初始化语句,但是必须加上分号 if condition1 {// do something} else ...原创 2018-09-04 14:47:03 · 169 阅读 · 0 评论 -
Go语言学习笔记--函数
函数编写的顺序无关紧要,鉴于可读性,最好把main()函数写在文件的前面Go里面有三中类型的函数:普通的带有名字的函数匿名函数或者lambda函数方法(Methods)注意:**go语言不允许函数重载,没有泛型概念**函数签名:函数参数,返回值以及它们的类型被统称为函数签名**空白符“_” 返回值:函数可以返回多个值,相当于python的元组。如果一...原创 2018-10-09 15:34:05 · 210 阅读 · 0 评论 -
Go语言学习笔记--数组与切片
一、数组基本概念1、一组相同类型已编号且长度固定的数据项序列声明格式:var identifier [len]type2、Go语言中数组是一种值类型,不是c中指向首元素地址,函数中使用 数组作为参数,是值传递,会产生一次数组拷贝。不会修改原数据3、将数组传递给函数,有两种方法1)传递数组的指针;2)使用数组的切片二、切片基本概念:1、切片是对数组一个连续片段的引用,...原创 2018-10-09 13:44:11 · 215 阅读 · 0 评论 -
Go语言学习笔记--map
map是引用类型 声明格式:var map1 map[keytype]valuetype,例如:var map1 map[string][int] key可以是任意可以用==或者!=操作符比较的类型,比如sting, int, float。所以数组、切片和结构体不能为key。指针和接口类型可以。 map初始化: 用{key1: val1, key2: val2}描述方法初始化; map...原创 2018-09-05 10:23:04 · 170 阅读 · 0 评论 -
Go语言学习笔记--读写数据
0666)文件拷贝 拷贝一个文件到另外一个文件,使用io包 src, err := os.Open(srcName) dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644) io.Copy(dst, src) 从命令行读取参数 os包总有一个string类型的切片变量os.Args,用来存放命令...原创 2018-09-05 18:10:05 · 466 阅读 · 0 评论 -
Golang教程第25节--mutex
原文来自:https://golangbot.com/mutex/本节我们将学习互斥锁。我们将学习如何利用互斥量mutexes和通道channel解决竞争问题。临界区在进入互斥锁之前,我们需要先了解程序中临界区的概念。当程序并发时,修改共享资源的代码不能够同时被多个协程同时修改。修改共享资源部分的代码就叫做临界区。例如:假设我们有一行代码给变量x加1:x = x + 1 如果...翻译 2018-10-14 00:28:03 · 346 阅读 · 0 评论 -
Golang教程第18节--接口(一)
原文来自:https://golangbot.com/interfaces-part-1/ 欢迎来到Golang教程第18节课程。接口有2节课,这是第一节。什么是接口?在面向对象领域,接口的一般定义是:接口定义了对象的行为。它只指定了对象应该做些什么。至于怎么做,取决于对象本身。在Go语言里,接口是方法签名的集合。如果一个类型提供了接口所有方法的定义,那么我们就说这个类型实现了该接...翻译 2018-10-17 23:11:57 · 306 阅读 · 0 评论 -
Golang教程第26节--go面向对象编程-结构体代替类
原文来自:https://golangbot.com/structs-instead-of-classes/Go是面向对象编程吗?Go不是存粹的面向对象编程语言从Go在FAQs上的摘要回答了Go是不是面向对象编程。Yes and no. Although Go has types and methods and allows an object-oriented style of p...翻译 2018-10-14 02:31:39 · 481 阅读 · 0 评论 -
Go语言学习笔记--net/http主要功能及部分源码阅读
首先,要认识一个贯穿始终的接口http.Handlertype Handler interface { ServeHTTP(ResponseWriter, *Request)} 其中,两个参数,一个是表示响应的接口,另一个表示请求。具体方法先忽略:type ResponseWriter interface {}使用时,这个函数指这定地址和对应的handler...原创 2018-10-08 16:25:19 · 156 阅读 · 0 评论 -
Go-类型断言
Java当中有instanceof这样的关键字判断类型 Go当中自然也有相应的方法来判断类型 即Comma-ok断言写法为value, ok := em.(T) 如果确保em 是同类型的时候可以直接使用value:=em.(T)一般用于switch语句中下面将会讲解到em代表要判断的变量 T代表被判断的类型 value代表返回的值 ok代表是否为改类型类型断言应该一看就懂...原创 2018-10-09 15:33:34 · 8945 阅读 · 1 评论 -
Go语言学习笔记--类型断言
一个接口类型的变量可以包含任何类型的值,必须有一种方式来检测它的动态类型,即运行时在比阿娘中存储的值得实际类型。在执行过程中动态类型可能会有所不同,但是它总是可以分配给接口变量本身的类型。通常我们可以使用类型断言类测试在某个时刻varI是否包含类型T的值:v := varI.(T) // unchecked type assertion类型断言的必要条件是varI是接口类型,非接口类型的...原创 2018-10-08 14:45:12 · 904 阅读 · 0 评论 -
Golang教程第27节--组合取代继承
原文来自:https://golangbot.com/inheritance/Go语言不支持继承,但是它支持组合。组合的定义是“放在一起”,组合的一个例子是车的组成,一辆车是由轮子,引擎和其他组件组合而成。结构体嵌套组合组合可以由结构体类型嵌套结构体来实现。博客帖子是个很好的组合例子。每个博客帖子都有标题,内容和作者信息,这可以用组合很好的表示。本节的后续,我们将学习如何实现。...翻译 2018-10-15 00:04:25 · 589 阅读 · 0 评论 -
Golang教程第28节--多态-Go面向对象编程
原文来自:https://golangbot.com/polymorphism/Go语言通过接口interface来实现多态。我们前面已经学过,接口可以在Go中隐式实现。如果一个类型为接口中声明的所有方法提供了定义,则实现一个接口。让我们来看看在接口的帮助下Go如何实现多态。接口实现多态任何一种类型,定义了接口所声明的所有方法,那么就称隐式实现了接口。接口类型的变量可以保存实现该接...翻译 2018-10-15 00:51:59 · 278 阅读 · 0 评论 -
Go语言学习笔记--测试用例
1. Go中的测试框架Go语言中自带有一个轻量级的测试框架testing和自带的go test命令来实现单元测试和性能测试,testing框架和其他语言中的测试框架类似,你可以基于这个框架写针对相应函数的测试用例,也可以基于该框架写相应的压力测试用例。2. 单元测试原则文件名必须是_test.go结尾的,这样在执行go test的时候才会执行到相应的代码 你必须import testi...转载 2018-10-15 00:58:48 · 707 阅读 · 0 评论 -
golang学习笔记--DNS域名解析实现
直接上代码:package mainimport ( "net" "fmt" "os")func main() { ns, err := net.LookupHost("www.baidu.com") if err != nil { fmt.Fprintf(os.Stderr, "Err: %s", err.Error()) return } for _, n...原创 2018-10-18 20:36:39 · 2402 阅读 · 2 评论 -
Golang教程第29节--defer
原文来自:https://golangbot.com/defer/什么是deferdefer语句的作用:在有defer语句的函数结束之前调用另外一个函数。定义看起来很复杂,我们通过一个例子就很容易理解。package mainimport ( "fmt")func finished() { fmt.Println("Finished finding ...翻译 2018-10-15 20:14:12 · 165 阅读 · 0 评论 -
Golang教程第30节--错误处理
原文来自:https://golangbot.com/error-handling/什么是错误?错误表示程序中出现了异常情况。比如当我们试图打开一个文件时,文件系统里却并没有这个文件。这就是一种异常情况,它用一个错误来表示。在 Go 中,错误一直是很常见的。错误用内建的 error 类型来表示。就像其他的内建类型(如 int、float64 等),错误值可以存储在变量里、作为函数的...翻译 2018-10-15 20:42:13 · 239 阅读 · 0 评论 -
Go的pprof使用
原文转自:http://www.cnblogs.com/yjf512/archive/2012/12/27/2835331.htmlgo中有pprof包来做代码的性能监控,在两个地方有包:net/http/pprofruntime/pprof其实net/http/pprof中只是使用runtime/pprof包来进行封装了一下,并在http端口上暴露出来pprof包web ...转载 2018-10-19 00:46:49 · 428 阅读 · 0 评论 -
Golang教程第31节--自定义错误
原文来自:https://golangbot.com/custom-errors/在上一节课里,我们学习了 Go 中的错误是如何表示的,并学习了如何处理标准库里的错误。我们还学习了从标准库的错误中提取更多的信息。在本教程中,我们会学习如何创建我们自己的自定义错误,并在我们创建的函数和包中使用它。我们会使用与标准库中相同的技术,来提供自定义错误的更多细节信息。New 函数创建自定义错误...翻译 2018-10-15 23:32:02 · 336 阅读 · 0 评论 -
为golang程序使用pprof远程查看httpserver运行堆栈,cpu耗时等信息
pprof是个神马玩意儿?pprof - manual page for pprof (part of gperftools)是gperftools工具的一部分gperftools又是啥?These tools are for use by developers so that they can create more robust applications. Especially...转载 2018-10-15 23:44:26 · 515 阅读 · 0 评论 -
Go语言学习笔记--centos7安装golang
1,下载二进制文件:下载链接:https://golang.org/doc/install?download=go1.11.linux-amd64.tar.gz#install2,解压并创建工作目录:tar -zxf goVersion.linux-amd64.tar.gz -C /usr/local/mkdir /go3,设置环境变量:export GOROOT=/...原创 2018-10-09 13:49:50 · 128 阅读 · 0 评论 -
Go学习笔记--go指针:unsafe.Pointer
Go语言是个强类型语言。也就是说Go对类型要求严格,不同类型不能进行赋值操作。指针也是具有明确类型的对象,进行严格类型检查。下面的代码会产生编译错误 :package mainimport ( "fmt")func main() { u := uint32(32) i := int32(1) fmt.Println(&u, &i) // ...原创 2018-10-09 15:09:20 · 7520 阅读 · 0 评论 -
Go语言学习笔记--Golang unsafe的妙用
unsafe.Pointer其实就是类似C的void *,在golang中是用于各种指针相互转换的桥梁。uintptr是golang的内置类型,是能存储指针的整型,uintptr的底层类型是int,它和unsafe.Pointer可相互转换。uintptr和unsafe.Pointer的区别就是:unsafe.Pointer只是单纯的通用指针类型,用于转换不同类型指针,它不可以参与指针运算;而ui...原创 2018-10-09 15:28:13 · 581 阅读 · 0 评论 -
Go并发原理
Go语言是为并发而生的语言,Go语言是为数不多的在语言层面实现并发的语言;也正是Go语言的并发特性,吸引了全球无数的开发者。并发(concurrency)和并行(parallellism)并发(concurrency):两个或两个以上的任务在一段时间内被执行。我们不必care这些任务在某一个时间点是否是同时执行,可能同时执行,也可能不是,我们只关心在一段时间内,哪怕是很短的时间(一秒或者两...转载 2018-10-16 10:34:14 · 161 阅读 · 0 评论 -
Go语言学习笔记--类型转换的“坑”
出于安全原因,Golang不允许以下之间的直接转换: 两个不同指针类型的值,例如 int64和 float64。 package mainimport ( "fmt")func main() { var i float64 = 3.13 var j int64 = 5 p := &i p = (*float64)(&j) fmt.Println(p...原创 2018-10-09 15:46:06 · 671 阅读 · 0 评论 -
Go语言学习笔记--unsafe.Pointer 和 uintptr
这里有一些关于unsafe.Pointer和uintptr的事实:uintptr是一个整数类型。 即使uintptr变量仍然有效,由uintptr变量表示的地址处的数据也可能被GC回收。 unsafe.Pointer是一个指针类型。 但是unsafe.Pointer值不能被取消引用。 如果unsafe.Pointer变量仍然有效,则由unsafe.Pointer变量表示的地址处的...原创 2018-10-09 15:52:58 · 12199 阅读 · 0 评论 -
以goroutine为例看协程的相关概念
基本上是网上相关文章的梳理,初衷主要是想了解下golang中的goroutine到底是怎么回事,以及相关的起源和概念。后来发现本质上应该是对于golang scheduler的理解,因为goroutine是golang scheduler实现的一个重要模块。这一篇入门吧,基本理解到还行,如果想深入细致了解还是应该看源码,就像参考的那些比较好的链接中的那样。补充 同步 异步 阻塞 非阻塞同步...转载 2018-10-16 13:46:28 · 193 阅读 · 0 评论 -
Golang教程第23节--缓冲通道和工作池
原文来自:https://golangbot.com/buffered-channels-worker-pools/什么是缓冲频道?我们在上一个教程中讨论的所有通道基本上都是无缓冲的。正如我们在通道教程中详细讨论的那样,发送和接收到无缓冲的通道都是阻塞的。可以使用缓冲区创建通道。仅当缓冲区已满时才会阻止对缓冲通道的发送。类似地,仅当缓冲区为空时才阻止从缓冲通道接收。可以通过将额外的...翻译 2018-10-10 00:17:48 · 855 阅读 · 0 评论 -
Golang学习笔记--函数作为值的使用
概念在C和C++中,函数是一组指令的集合,这组指令的入口地址用函数名来表示,所以,在C和C++中,函数名称是一个地址。 但是在Go语言中,函数是一种类型,而且是第一类型(first-class)。他的地位和int string等类型是一样的。我们经常会声明一个值类型为int或者string类型的变量,现在我们可以声明一个值类型为某个函数的变量,这种变量叫做函数变量也就是说,函数可...原创 2018-10-16 16:17:02 · 243 阅读 · 0 评论 -
golang工作池
在golang编写服务程序过程中,如果每次来斗启动一个goroutine去处理任务,处理一个任务后就退出,这样势必会造成资源浪费。构建一个工作goroutine池来处理任务相对资源利用会少些,具体的情况需对比测试。首先定义工作goroutine池,内部定义了两个变量,一个是任务队列,一个是需启动goroutine的数量type WorkerPool struct { tasks ...原创 2018-10-10 00:55:26 · 633 阅读 · 0 评论 -
golang教程33节-头等函数(first class functions)
原文来自:https://golangbot.com/first-class-functions/什么是头等函数(first class functions)编程语言支持头等函数是指:允许函数作为类型可以赋值给变量,作为参数传递给其他函数,从其他函数返回。Go语言支持头等函数。这一节我们将导论头等函数的语法和各种使用案例。匿名函数让我们一个简单例子开始:将函数赋值给一个变量。...翻译 2018-10-16 18:05:06 · 736 阅读 · 0 评论 -
Golang教程第32节--panic 和 recover
原文来自:https://golangbot.com/panic-and-recover/什么是 panic?在 Go 语言中,程序中一般是使用错误来处理异常情况。对于程序中出现的大部分异常情况,错误就已经够用了。但在有些情况,当程序发生异常时,无法继续运行。在这种情况下,我们会使用 panic 来终止程序。当函数发生 panic 时,它会终止运行,在执行完所有的defer函数后,程序...翻译 2018-10-16 18:20:38 · 1740 阅读 · 1 评论