自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

浩玥当空

纯技术交流

  • 博客(26)
  • 收藏
  • 关注

原创 22-go内置函数

内置函数go语言提供了一些列内置函数1. append给slice添加元素,有多种用法:直接添加元素,可以同时添加多个.将另外1个切片添加到指定切片.将string添加到byte切片.1.1 切片容量问题添加新的元素后,原来切片的容量足够,就将元素直接放在原来切片的数组内。如果超出了原来切片容量,append将会新建一个slice,为新的slice的底层数组重新申请一块内存,...

2019-08-11 00:00:06 171

原创 21-chan原理5-close

关闭channel关闭一个channel的底层实现是 runtime.closechanclose(var_chan_1)//对应汇编0x0146 00326 (channel.go:51) CALL runtime.closechan(SB)runtime.closechansrc\runtime\chan.go加锁channel的关闭过程是加锁的。 发送、读取...

2019-08-04 15:06:29 278

原创 20-chan原理4-select

6. selectselect语句的语法:每个case都必须是一个channel的发送、或者接收操作。所有channel表达式都会被求值。如果任意case中表达式可以进行,它就执行,其他被忽略。如果有多个 case都可以运行,Select会随机公平地选出一个执行。其他不会执行。一个没有任何case的select语句写作select{},会永远地等待下去没有break。否则:如果...

2019-07-18 07:46:30 163

原创 19-chan原理3-发送

5. 发送chan由汇编可以看出,向chan发送数据会转化为对runtime.chansend1()->chansend()->send()的调用。 tmp :=9999 var_chan_1 <- tmp 0x00fb 00251 (channel.go:32) MOVQ $9999, ""..autotmp_6+64(SP...

2019-07-18 07:45:29 358

原创 18-chan原理2-读取

4. 读取chan由汇编可以看出,读取一个chan,转化为对runtime.chanrecv1()的调用。如果采用两个返回值方式,则转化为runtime.chanrecv2()调用,区别在于返回一个bool值,标识是否接收到了数据。参数1,chan本身。参数2,接收读取数据的变量。var var_chan_1 = make(chan int)var_read = <-var_c...

2019-07-18 07:44:41 443

原创 17-chan原理1-创建

1. 并发模型对于大量的服务请求,有两种服务模式:单一服务模式、多服务模式。对于单一服务模式,比较典型的如Redis,单进程,单线程服务。这种模式简单高效,但是适用场景有限,很容易达到服务能力的瓶颈。多服务模式有很多种实现方式。适应于不同的业务场景。由于是多服务,不同服务间难免存在对同一资源的访问,这就涉及到服务间的同步问题。不同服务实现方式,同步的机制不同。线程是操作系统对进程管理的最小粒...

2019-07-14 23:14:08 431

原创 16-go调度器触发-syscall

golang提供syscall库对操作系统的系统调用作了封装,比如:func Open(path string, mode int, perm uint32) (fd int, err error)func Read(fd int, p []byte) (n int, err error)func Write(fd int, p []byte) (n int, err error)对于s...

2019-07-09 23:13:30 569

原创 15-go栈管理

Linux下线程栈最大大小可以通过ulimit -s查看,单位KB。go@ubuntu:~$ ulimit -s 8192go@ubuntu:~$ 可以通过ulimit -s 指定全局栈大小。也可以通过 pthread_attr_setstacksize()指定当前线程的栈大小。这两种方式前者会造成系统内存的浪费,后者需要评估线程大小,使用起来并不方便。为了解决这个问题,gcc给出了...

2019-07-07 23:36:45 347

原创 14-go调度器

go调度器主要有4个重要结构:m,p,g,schedt。定义在src\runtime\runtime2.go中。schedt结构就是调度器,它维护有存储M和G的队列以及调度器的一些状态信息等。1. MPG1.1 M:代表内核级线程一个M就是一个线程,goroutine就是跑在M之上的;M是一个很大的结构,里面维护小对象内存cache(mcache)、当前执行的goroutine、随机数...

2019-07-03 23:28:29 331

原创 13-goroutine创建过程

1. 创建一个goroutine通过go创建一个goroutine。底层通过runtime.newproc()创建。go my_goroutine();//对应汇编0x0034 00052 (mygoroutine.go:13) CALL runtime.newproc(SB)2. runtime.newproc()切换到系统栈(g0,或者gsinal),执行n...

2019-06-30 18:36:09 854

原创 12-go进程启动过程

bootstrap顺序// The bootstrap sequence is://// call osinit// call schedinit// make & queue new G// call runtime·mstart//// The new G calls runtime·main.src\runtime\asm_amd64.sgo进程的启动过程在...

2019-06-28 23:19:38 1363

原创 11-go reflect Value

ValueOf()将一个接口中保存的动态类型,值放到结构体Value变量中。由于有了数据类型、值信息。因此可以将一个Value对象转换为一个接口。对于原来对象值的修改,要求ValueOf()传入的必须是一个地址。然后通过SetFloat,SetString等接口修改值。方法调用:如果保存的值是一个方法,那么可以通过Call()接口调用。可以通过MethodByName获取指定的方法,然后通过...

2019-06-23 19:27:37 534

原创 10-go rang原理

gofrontend\go\statements.cc根据range_type,进行不同的处理。slice、array、string、map、channel// Arrange to do a loop appropriate for the type. We will produce // for INIT ; COND ; POST { // ITER_...

2019-06-23 18:18:24 233

原创 09-go类型断言

类型断言适用对象 var i int32Value =100; if t,ok := i.(int32);ok { i = 200; }类型断言只能用于interface变量。invalid type assertion: i.(int32) (non-interface type int32Value on l...

2019-06-23 12:18:37 257

原创 08-go数据类型内存结构-interface

1. 值接收者和指针接收者实现了接收者是值类型的方法, 自动生成了接收者是指针类型的方法;实现了接收者是指针类型的方法,不会自动生成对应接收者是值类型的方法。2. iface 与 eface都是两个成员,第二个成员都是接口存放的数据。不同的是第一个成员。eface._type接口保存的实体类型,没有包含任何接口方法。iface.tab是一个itab结构,itab.inter是一个i...

2019-06-23 12:03:23 839

原创 07-go数据类型内存结构-struct

struct 为所有成员依次存放。type student struct { name string age int32}var var_stu student = student{name:"aaaaa",age:18}"".var_stu SDATA size=24 0x0000 00 00 00 00 00 00 00 00 05...

2019-06-23 11:53:23 368

原创 06-go数据类型内存结构-chan

5. chanvar var_chan = make(chan int ,1)func func1(){...var var2_chan = make(chan int ,3)...}1、通过runtime.makechan()创建channel。2、第一个参数为chan类型信息3、返回值类型为*hchan即: chan变量实际为一个hchan指针由全局变量也可以看出。f...

2019-06-23 11:52:21 289

原创 05-go数据类型内存结构-slice

5. slicevar var_slice []int = []int{1,2,3,4,5,6};slice变量有三部分组成1-数组地址2-slice长度3-slice容量 1879 "".var_slice SDATA size=24 1880 0x0000 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 ...

2019-06-23 11:49:18 226

原创 04-go数据类型内存结构-map

4. mapmap变量只有8个字节,指向map对象自己。var var_map map[int64]int64 = map[int64]int64{0x1234:0x1234};1878 "".var_map SBSS size=8var var2_map map[int64]int64 = map[int64]int64{0x1234:0x1234};1、调用运行时runtime....

2019-06-23 11:43:42 433

原创 03-go数据类型内存结构-string

3. stringvar var_string string = "this is a string"字符串内存中有两部分1、字符串内存地址2、字符串长度go.string."this is a string" SRODATA dupok size=16 0x0000 74 68 69 73 20 69 73 20 61 20 73 74 72 69 6e 67 th...

2019-06-23 11:40:19 660

原创 02-go数据类型内存结构-整数

1. 整数type myint32 int32type myint322 int32var var_byte byte = 0x12;var var_rune rune = 0x12;var var_int8 int8 = 0x12;var var_int32 int32 = 0x12;var var_myint32 myint32 = 0x12;var var_myint322 ...

2019-06-23 11:37:52 189

原创 01-go数据类型

###1、通过type定义的类型,与原类型不同。###2、计算架构相关的整数类型int,uint###3、显式表达自身宽度的整数类型int8,int16,int32,int64uint8,uint16,uint32,uint64###4、浮点数浮点数类型有两个:float32/float64###5、复数类型复数类型有两个:complex64/complex128###6、...

2019-06-23 11:36:29 137

原创 4.refelct.MethodByName()

3. 接口方法实现-MethodByName()方法将动态类型压入栈,作为MethodByName。Type变量176偏移位置为MethodByName()方法地址。样例代码5 type person struct {6 name string7 age int328 }20 var var_person person = person{na...

2019-06-19 22:17:13 1399

原创 3. reflect.ChanDir()

2. 接口方法实现-ChanDir() 方法将Type接口的值,即动态类型入栈调用Type接口方法ChanDir(),参入即动态类型。判断动态类型是否chan,否则panic将动态类型转换为chanType类型返回chanType类型中的chan方向// chanType represents a channel type.type chanType struct { rtyp...

2019-06-16 16:00:37 171

原创 1. reflect.Type

1 实现文件gofrontend\libgo\go\reflect\type.gogofrontend\libgo\go\reflect\value.go这里定义了内部类型src\reflect\type.gosrc\runtime\type.go2. reflect.Typereflect.Type是一个interface.type Type interface {...}...

2019-06-16 15:58:02 266

原创 2.reflect.TypeOf()

反射主要与Golang的interface类型相关(它的type是concrete type),只有interface类型才有反射一说。反射就是用来检测存储在接口变量内部(值value;类型concrete type) pair对的一种机制。Golang的reflect有什么样的方式可以直接获取到变量内部的信息?它提供了两种类型(或者说两个方法)让我们可以很容易的访问接口变量内容,分别是re...

2019-06-16 14:02:29 1568

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除