Go语言中文网 为您找到相关结果 560

go语言的动态内存

go语言动态内存的申请和释放设计来自于tcmalloc主要数据结构:MHeap:the malloc heap,管理pageMCentral:特定类型小对象共享的free listMCache:线程本地小对象的共享free list 分配小对象 查找MCache相应大小的free list,如果free list非空,从free list中直接获取, 这种情况下不需要任何锁的开销 如果MCache的free list为空,则从MCentral获取一些free object 如果MCentral的free list为空,则从MHeap申请一些page,然后将page内存加入到相应MCentral的free list 如果MHeap缓存的page不足,则从操作系统申请一些page(至少1M) 分...阅读全文

博文 2015-05-18 03:00:01 richmonkey

golang之slice和map比较

最近在看golang的时候发现golang的map类型的元素比较特殊,也就是不能够取地址。因为map实际上是一张hash表,当map元素数量增加的时候,当前分配的内存不足以存放新的数据,就会重新分配更大的内存空间,并把原有的数据迁移过来。因此以前的地址保存的就不是当前map中的元素了。思考了一下,slice应该也是类似的但是slice是允许取地址操作的,因此做了一个小验证:s1 := make([]string, 1, 1) s1[0] = "a" a := &s1[0] *a = "c" fmt.Println(s1)//output: [c]s1 := make([]string, 1, 1) s1[0] = "a" a := &s1[0] s1 = append(s1, "b") *a...阅读全文

博文 2018-11-03 01:34:44 pysta

golang基础--Array数组

基本特性 格式: var Name [n],n>0 如: var a [10]int 表示,定义一个长度为10,元素类型为int性的数组 数组长度: 长度(len)也是数组类型的一部分,因此具有不同长度的数组为不同的类型。 如var a [2]int != var a [2]int 注意区分指向数组的指针和指针数组 // 指向数组的指针:变量是指针 a :=[...]int[9:1] //顶一个变量a的数组(长度为100,第100个元素为1) var p *[...]int = &a //定义一个p的变量,类型为指针 //指针数组:变量是数组,元素是指针(内存地址) x , y := 1,2 b :=[...]*int(&x,&y) print (p) print (b) /*输...阅读全文

博文 2018-07-12 13:30:34 failymao

golang ioutil.ReadAll引发的内存异常

ioutil.ReadAll 是一个常用的数据读取方法,经常用来读取http请求的response数据,或者读取文件数据。 demo1: http func handle(r *http.Request, w http.ResponseWriter) { file, err := os.Open("tmp.zip") // error checks... b, err := ioutil.ReadAll(file) // error checks fmt.FPrintf(w, b) } demo2 : 模拟shell md5sum 获取文件MD5 func genmd5(file string) string{ cf, err := os.Open(file) //err check def...阅读全文

博文 2020-01-17 01:32:46 Cargador

golang协程测试

package main import ( "fmt" "time") const NUMBER = 1000000 func test() { for { }} func main() { fmt.Println(time.Now().UnixNano()) for i := 0; i < NUMBER; i++ { go test() } fmt.Println(time.Now().UnixNano()) for { }} 启动100W个协程,占用了:4599640KB内存,平均每个占用:4.6KB内存...阅读全文

博文 2014-10-04 19:26:08 samurail

Go 逃逸分析

文地址:Go 逃逸分析 什么是逃逸分析 堆和栈 要理解什么是逃逸分析会涉及堆和栈的一些基本知识,如果忘记的同学我们可以简单的回顾一下: 堆(Heap):一般来讲是人为手动进行管理,手动申请、分配、释放。堆适合不可预知大小的内存分配,这也意味着为此付出的代价是分配速度较慢,而且会形成内存碎片。 栈(Stack):由编译器进行管理,自动申请、分配、释放。一般不会太大,因此栈的分配和回收速度非常快;我们常见的函数参数(不同平台允许存放的数量不同),局部变量等都会存放在栈上。 栈分配内存只需要两个CPU指令:“PUSH”和“RELEASE”,分配和释放;而堆分配内存首先需要去找到一块大小合适的内存块,之后要通过垃圾回收才能释放。 通俗比喻的说,栈就如我们去饭馆吃饭,只需要点菜(发出申请)--》吃吃吃...阅读全文

博文 2019-07-14 16:32:37 WilburXu

万丈高楼平地起|初识Go语言

0.前言从1月19号到今天已经12天没有更新文章了,这个春节显得格外特殊,突如其来的疫情打乱了我们的生活和工作。特殊时期我们可以积极转发有效信息、减少外出、避免出入拥挤场所、劝导家人朋友重视疫情保护自身、多陪伴父母家人共克时艰。北京窗外的阳光似乎还不错,很怀念之前自由自在的感觉,由衷希望早一天战胜疫情,大家摘掉口罩走上街头,露出灿烂脸庞,像往日一样拥抱自由,拥抱阳光。言归正传,之前计划写的TCP/IP协议栈系列文章再次跳票,但是大白准备双线作战再开一个Go语言专题,后续会推出系列文章,慢慢来大家也别急, Go is the way to go!说实话,大白水平有限写个21天玩转系列确实搞不定,要写个210天玩转我觉得比较有戏。所谓兵马未动粮草先行,图为大白之前买的关于Go语言的书,还比较新:...阅读全文

博文 2020-02-04 11:34:22 后端技术指南针

make(map[int]string, 1) 这第二个参数 1是 map的大小?

在go的 包中显示make 第二个参数表示大小,我试着声明一个长度为1 的当长度超过1时 不应该换一块内存地址,重新存储?![111.png](https://static.studygolang.com/180130/de5e30f4c9cb18521dc9650645e2d3e5.png)![Screenshot 2018-01-30_21-17-09.png](https://static.studygolang.com/180130/99ef92273df2b4f71e62dfde99d0f874.png...阅读全文

C/Golang中的值传递和指针传递

-------------------------golang---------------------------------------------- package main import "fmt" func A(m int, n []int) { m = 100 n[0] = 99 fmt.Printf("After : &m=%p,&n=%p,n=%p\n", &m, &n, n) fmt.Printf(" m=%d,n=%v\n", m, n) } func main() { m := 300 n := []int{1, 2, 3} fmt.Printf("-----------origin--------------------\n") fmt.Printf("Befter ...阅读全文

如果golang想成为主流语言,还需要解决哪些重要的问题

最近编程语言当中,golang无疑是风生水起,年度语言,服务器端语言,并发语言,皇冠可谓不少。golang开发的初衷是替换掉c/c++,作为系统级语言,加上在1.3版本中打算将编译系统从原来c语言开发的plan 9编译器,改为golang实现,可谓野心勃勃。golang最令人赞美的就是简单的语法,你可能花不了一天就能掌握golang的语法,关键字。golang的goroutine和channel给了大家一种简单的并发编程模型(在此指出的是channel是另一种选择,并不是用来替换掉Lock机制的并发编程,而是相互补助)。 在这里,给golang泼泼冷水,或者说,如果golang想成为主流语言,还需要解决哪些重要的问题。 一个无锁的sched调度算法。 golang容许你创建成千上万的goro...阅读全文

博文 2014-11-11 00:00:12 legend_x

go map (映射-类似其它语言的集合)

map介绍 map是key-value数据结构,又称为字段或者关联数组。类似其它编程语言的集合。 基本语法 var map的变量名 map(关键字)[keyType]valueType 1、key可以是什么类型 golang中的map可以是多种类型,比如 bool,数字,string,指针,channel(管道),还可以是只包含前面几个类型的 接口,结构体,数组, 通常是 int,string slice map function 不可做为key的数据类型。 2、valueType可以是什么类型 valueType的类型和key基本一样,通常为:数字(整数,浮点数),string,map,struct map的声明 var a map[string]string var a map[stri...阅读全文

博文 2019-04-02 12:34:40 StevenQin

[GoLang学习总结]Go语言中的Slice

概念 Slice切片是对底层数组Array的封装,在内存中的存储本质就是数组,体现为连续的内存块,Go语言中的数组定义之后,长度就已经固定了,在使用过程中并不能改变其长度,而Slice就可以看做一个长度可变的数组进行使用,最为关键的,是数组在使用的过程中都是值传递,将一个数组赋值给一个新变量或作为方法参数传递时,是将源数组在内存中完全复制了一份,而不是引用源数组在内存中的地址,为了满足内存空间的复用和数组元素的值的一致性的应用需求,Slice出现了,每个Slice都是都源数组在内存中的地址的一个引用,源数组可以衍生出多个Slice,Slice也可以继续衍生Slice,而内存中,始终只有源数组,当然,也有例外,后边再说。 用法 1.Slice的定义 Slice可以通过两种方式定义,一种是从源数...阅读全文

博文 2015-06-17 20:23:36 tiger435

Golang Map 实现 (二) map 的创建

本文在golang map 数据结构的基础上,学习一个make 是如何构造的。 map 创建示例 在golang 中,初始化一个map 算是有两种方式。 example1Map := make(map[int64]string) example2Map := make(map[int64]string, 100) 第一种方式默认不指定map的容量,第二种会指定后续map的容量估计为100,希望在创建的时候把空间就分配好。 当make创建map时,底层做了什么 对于不同的初始化方式,会使用不同的方式。下面是提供的几种初始化方法: // hint 就是 make 初始化map 的第二个参数 func makemap(t *maptype, hint int, h *hmap) *hmap fun...阅读全文

博文 2020-04-30 10:32:40 搬砖程序员带你飞

Go语言之Once

自公众号“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/DRjuGDwE04f0Yy9QvpYufAsync.Once是sync包中的一个对象,它只有一个方法Do,这个方法很特殊,在程序运行过程中,无论被多少次调用,只会执行一次。1.适用场景:在一个进程之中,如果一个函数里面的一部分代码,希望在很多协程都执行的时候,只被执行一次,那么Once便起到了作用。例如:初始化进程中的共享内存,它只希望被该进程初始化一次,其他协程不需要初始化操作。例子:​结果分析:从上面的输出结果可以看出,使用了once.Do之后,onceBody()函数中的代码只被调用了一次。其他的协程依然还在运行,但是并没有去执行onceBody()函数中的代码。2. 源码如下所示:Once的数据...阅读全文

博文 2019-12-23 14:21:23 ZhDavis

Go语言中复合的数据类型

数组 数组是同一种数据类型元素的集合。在Go语言中,数组从声明时就确定,可以对其成员进行修改,但是不可以修改数组的大小。 数组的定义 数组的基本定义语法如下: var 数组名 [数组大小]类型 比如定义一个长度为3,类型是int的数组: var a [3]int 注意:长度必须是常量,它是数组类型的一部分,一旦定义,长度不能改变。 数组的初始化 (1)、初始化数组时可以使用初始化列表来设置数组元素的值。 func main() { var testArray [3]int //数组会初始化为int类型的零值 var numArray = [3]int{1, 2} //使用指定的初始值完成初始化 var cityArray = [3]string{"北京", "上海", "深圳"} //使用指...阅读全文

博文 2020-03-16 01:33:16 Uncle_Joker

GO语言(golang)切片slice

/*640*60,创建于2013-5-24*/ var cpro_id = "u1290382"; 切片slice是引用类型 len()函数获取元素的个数 cap()获取数组的容量 1.申明方式 [php] (1)var a []int 与数组不同的是他不申明长度 (2)s2 := make([]int, 3, 10) //元素的类型,元素的数量,元素的容量 fmt.Println(len(s2), cap(s2)) 输出元素的数量和容量 [/php] 2.讲数组转换成切片 [php] a := [10]int{} fmt.Println(a) s1 := a[:10] //取前10个元素 [5:]取 5-最后的元素 fmt.Println(s1) [/php] 3.slice测试 [php...阅读全文

图解Go内存分配器

本文翻译自《A visual guide to Go Memory Allocator from scratch (Golang)》。 当我刚开始尝试了解Go的内存分配器时,我发现这真是一件可以令人发疯的事情,因为所有事情似乎都像一个神秘的黑盒(让我无从下手)。由于几乎所有技术魔法都隐藏在抽象之下,因此您需要逐一剥离这些抽象层才能理解它们。 在这篇文章中,我们就来这么做(剥离抽象层去了解隐藏在其下面的技术魔法)。如果您想了解有关Go内存分配器的知识,那么本篇文章正适合您。 一. 物理内存(Physical Memory)和虚拟内存(Virtual Memory) 每个内存分配器都需要使用由底层操作系统管理的虚拟内存空间(Virtual Memory Space)。让我们看看它是如何工作的吧。...阅读全文

下面代码中的变量会自动释放内存吗

```go var ch1 = make(chan []byte,4096) func test() { exit_sem := make(chan bool) for{ select { case pkg := <- ch1: /*...*/ case flag := <-exit_sem: /*...*/ case <-time.After(time.Second * 120): } } } ``` pkg和flag这种 循环内部变量的空间会被自动释放吗,会不会造成内存一直增长? 如果普通变量会释放,那么循环内部创建了channel会被释放...阅读全文

【Golang】百万级高并发实践

自:https://blog.csdn.net/jeanphorn/article/details/79018205写在前面Go语言作为新兴的语言,最近发展势头很是迅猛,其最大的特点就是原生支持并发。它使用的是“协程(goroutine)模型”,和传统基于 OS 线程和进程实现不同,Go 语言的并发是基于用户态的并发,这种并发方式就变得非常轻量,能够轻松运行几万并发逻辑。Go 的并发属于 CSP 并发模型的一种实现,CSP 并发模型的核心概念是:“不要通过共享内存来通信,而应该通 过通信来共享内存”。这在 Go 语言中的实现就是 Goroutine 和 Channel。场景描述在一些场景下,有大规模请求(十万或百万级qps),我们处理的请求可能不需要立马知道结果,例如数据的打点,文件的上传等...阅读全文

博文 2018-12-15 13:31:32 baidu_39511645

程序员怎么会不知道 C10K 问题呢?

今天简单说下C10K 的问题,关于这个问题Ruby 的作者松本行弘在《代码的未来》- 云计算时代的编程 一章中有详细的阐述, 有兴趣的同学可以直接去购买。本人已经在某淘,购买一本 哈哈哈~~~ 在做技术规划和架构设计的时候,不要做过度设计,如果咱们只有一万用户,先别去操百万用户在线的心。淘宝那么大,也是从 Apache、PHP、MySql 发展起来的, 没人能预见到淘宝能发展到这样一个规模,一旦发展起来,业务的爆发增长会驱动技术的迅速发展,在业务还不及格的时候,不用为技术的未来担心。 这个思路在业务领域不会有太大的问题,因为需求的变化实在太快了,需要实时去应付。但在底层技术的发展上,我们就有可能遇到短视的报复,比如:这个数据长度不会超过16位吧,这个程序不可能使用到2000年吧。于是就有了千...阅读全文

golang中,协程之间通信的方式除了channel还有啥?

先撇掉共享内存这个方式,我要在各个goroutine之间传递数据,除了用channel还有别的方法嘛? 还有个问题,channel稳定吗?会不会出线数据丢失的情况,因为现在的场景是这一条数据丢了就永远丢了,所以害怕高并发下大规模使用channel的话有数据丢失就麻烦...阅读全文

Go 语言 make & new

make 与 new 都是 Go 语言分配变量内存的方式,其中 make 主要针对 slice、map 与 chan 变量类型的内存分配以及相应内部结构的初始化,而 new 可以申请任何类型变量内存,但是拿到内存后会赋零值,他对于 slice、map 以及 chan 类型变量的申请没有太大意义。下面依据实际示例对这两种内存分配方式的区别进行个简单分析。 分配 sclie var s0 []int s0 = append(s0, 10) fmt.Println(&s0, s0) s1 := new([]int) *s1 = append(*s1, 10) fmt.Println(s1, *s1) s2 := make([]int, 0) s2 = append(s2, 10) fmt.Prin...阅读全文

博文 2015-12-10 16:00:31 u013148156

go语言学习笔记之并发编程

编译自http://golang.org/doc/effective_go.html#concurrency (翻译错误之处,敬请指正) 1. 通过通讯共享内存(Share by communicating): Do not communicate by sharing memory; instead, share memory by communicating. 不要通过内存共享进行通讯;应当通过通讯来共享内存。使用信道(channels)来控制变量的访问可以更为容易地编写出清晰、正确的程序。 2. Goroutines: 为什么创造goroutine这个新词? 原因就是现有的术语,比如线程、协程、进程等等都不能精确的表达其所要表达的内涵(译者在这里也建议不要将其翻译成中文,因为中文里也没...阅读全文

博文 2014-10-04 19:26:39 agateriver

golang 互斥锁

1,竞态的出现原因竞态的产生是因为多个对象同时访问一个对象的时候就会产生。 最常见的例子是数据库。在开发中多线程首先面对的问题就是如何竞争资源。例子来源于网络,大致应该是:vara =0funcrun(){fori :=0; i <1000; i++ {goadd()}time.Sleep(10* time.Minute)fmt.Println(a)}funcadd(){a++}请允许我使用 time.Sleep() 来让主线程等待结果。其实也可以使用waitgroup来调度1000个协程的。上面的例子可以得出的结果是不一定,如果1000个协程按照顺序进行处理的话结果应该是1000.2, 要处理竞态,golang提供了一个库,sync 看名字就知道是和竞态有关系的。Mutex 互斥锁首先看下...阅读全文

博文 2018-11-09 22:34:38 傻孩子有福气

Go 指针声明后赋值,出现 panic: runtime error: invalid memory address or nil pointer dereference

指针基础知识 package main import "fmt" func main() { var p *int p = new(int) *p = 1 fmt.Println(p, &p, *p) } 输出 0xc04204a080 0xc042068018 1 在 Go 中 * 代表取指针地址中存的值即指针的值(这个值是一个内存地址),& 代表取一个值的内存地址也可以是一个指针的内存地址。 对于指针,我们一定要明白指针储存的是一个值的内存地址,但本身这个指针也需要内存地址来储存。 如上 p 是一个指针,他的值为内存地址 0xc04204a080 而 p 指针本身的内存地址为 0xc042068018 内存地址 0xc04204a080 储存的值为 1 内存地址 0xc042068018...阅读全文

博文 2019-07-26 11:32:44 EricJonse

golang利用reflect包实现struct与params自动绑定

前言 因为 golang 静态强类型语言特性以及没有很好的泛型支持导致在用 go 写 web 服务的时候,总会因为要对 http params 的解析和类型转换上要花很多时间,并且这会让代码显得很冗余,那有什么办法可以解决这一苦痛呢?答案当然是有的,这里我讲会到如何用 reflect 包写一个工具类实现 model 层 struct 与 http params 的自动映射绑定。 具体实现其实很简单,主要用到的就是通过 reflect.TypeOf() 获取字段的类型(包括字段名,类型,Tag描述等相关信息),以及 reflect.ValueOf() 来获取字段的值类型用于复写从params获取到的数据, 同时还要注意不同类型数值在 Set 时的差别。 用料 首先我们设计一个struct来储存...阅读全文

博文 2018-05-19 20:48:29 音風の部屋

Go圣经-学习笔记入门bufio.Writer

Go圣经-学习笔记入门bufio.Scanner bufio标准库中的Reader和Writer,最好用于文件IO操作,把数据先缓存到内存中,然后再整体做文件IO操作,尽最大可能地减少磁盘IO,但是内存缓冲区的大小要合理设置,默认大小是4096个字节。 bufio.Writer使用 bufio标准库中的Writer提供的方法列表 type Writer struct { err error buf []byte n int wr io.Writer } // 实例化bufio.Writer, 实例化是会直接分配大小为len(w.buf)大小的内存空间,Writer.n表示内存缓冲区已经存放的字节大小 func NewWriter(w io.Writer) *Writer func NewWr...阅读全文

博文 2017-10-22 00:31:17 cdh0805010

golang工程师面试第一天

**1**.求两个字符串的交集 ```go package main import "fmt" func main() { str1 :="abcdef" str2 :="hghcdesghv" /* 将字符串遍历,比较字节相同则输出 */ for _,v1:=range str1 { for _,v2:=range str2 { if v1==v2 { fmt.Printf(string(v1)) } } } }``` **2** .未知逻辑运算符优先等级 ```go package main import "fmt" /* 未知 && ||逻辑运算优先级 通过代码求优先级 */ func main() { a :=true b :=false c :=false if a&&b||c{ ...阅读全文

博文 2018-01-13 20:11:39 yinshidaoshi

golang使用slice中遇到的坑

package main import ( "fmt" ) func sliceFunc(i []int, num int) []int { for j := 0; j < num; j++ { i = append(i, 3) } i[0] = num return i } func main() { s := make([]int, 0, 3) s = append(s, 1) fmt.Printf("cap=%d\ts=%v\n",cap(s),s) fmt.Println("=========") s1 := sliceFunc(s, 2) fmt.Printf("cap=%d\ts=%v\n",cap(s),s) fmt.Printf("cap=%d\ts1=%v\n",cap(s...阅读全文

博文 2016-08-30 16:00:00 52zjj

golang系列课程(五)—— golang高级特性

协程 协程是golang最重要的一个特性。在协程出现之前,线程被作为调度的最小单位。协程可以理解是一种用户态,逻辑层面的线程。 通过协程,我们将很容易地实现高并发。 加入你要做三件事,假设要执行a,b,c三个方法。代码该怎么写?平常我们的写法就是 a() b() c() 复制代码只有a做完了,才能做b,b做完了,才能做c。 但有了协程就可以 go a() go b() go c() 复制代码三个同时进行,充分利用多核的性能。 管道 管道概念 类似unix中管道(pipe) 先进先出 线程安全,多个goroutine同时访问,不需要加锁 channel是有类型的,一个整数的channel只能存放整数 管道的定义 var ch0 chan int var ch1 chan string var ...阅读全文

博文 2019-08-19 03:34:27 叶不闻

golang的指针类型,unsafe.Pointer类型和uintptr类型的区别

一,区别 1,指针类型 golang支持指针类型,指针类型的变量存的是一个内存地址,这个地址指向的内存空间存的才是一个具体的值。 比如int,int32,A(自定义结构体类型),string等,都是指针类型。 golang的指针类型和c/c++的指针类型基本一样,但是多了几个限制: 1,int,int32等不同的指针类型不能相互转化. 2,指针类型不支持c/c++这样的指针运算。 2,unsafe.Pointer类型 这个类型比较重要,它是实现定位和读写的内存的基础。go runtime大量使用它。官方解释是: Pointer represents a pointer to an arbitrary type. There are four special operations availa...阅读全文

博文 2020-05-02 23:33:10 舒小贱

指针与引用的区别

指针与引用的区别。由new生成的指针指向了特定的内存,它是不变的。而由make生成的内存块大小是可变的,当切片的增长超出了cap指定的大小时,将会重新分配一块更大的内存并将原切片内容复制过去,切片指向了新的内存块,切片原来的内存将会释放并回收。所以切片指向的内存地址是会变的。如果这一切还象指针那样由程序员来管理,难度是很大的。好在GO语言中这一切由系统来自动管理,程序员使用切片的名字来引用特定的内容,而不需要知道它们变动到了实际内存的哪块位置。引用的实质是用名字操作代替了指针操作,从而屏蔽与简化了这背后的指针操作复杂性...阅读全文

Go手动内存分配

2013-10-27 Go手动内存分配 Go手动内存分配 用Go的时候,有时候又想自己管理内存。所以决定写个手动内存管理的包吧。就当无聊练练手... 总体设计 两级分配。较大内存以页为单位分配,每页4k。分配出去的大块内存只能是1页,2页,3页...较小内存使用buddy算法结合分配池的方式进行分配。buddy算法主要是方便回收,对于各种不规则大小则分别维护一个free的链表。 整体上基本类似于Go本身使用的内存管理算法,除了没有引入垃圾回收标记信息,以及对小对象使用buddy分配算法。 buddy算法 管理结点使用的内存跟最小最大结点相关。如果最小单元太小,则浪费过多的管理结点。管理结点数目=最小单元数目*2 如果最大单元过大,则需要用更长的整型来记录大小,单个管理结点的大小增加。 bud...阅读全文

博文 2015-03-17 10:25:55 zenlife

golang结构体指针解析

golang指针可以这样理解:本身为一个整型常量,但由于其声明时为指针,因此拥有了特殊的能力,即在其前增加 * ,即可直接访问内存编号为该整型常量的数据。而对于某个定义的常量,在前面加 & ,也可以获得数据的内存编号。当我们定义结构体指针时,问题出现了: type name int8 type first struct { a int b bool name } func main(){ var type1 = first{1, false, 2} var type_pointer *first = &type1 fmt.Println(type_pointer) } 上面的代码打印的结果为:&{1 false 2}由此可推论,结构体本身并没有代表其自身的内存地址,存在内存地址的是结构体内部...阅读全文

博文 2020-02-04 10:32:38 回到未来丶

Go语言结构struct(普及golang)

/*640*60,创建于2013-5-24*/ var cpro_id = "u1290382"; 1.struct 简洁 这个的struct和C语言的很相似,模拟出class的功能,但是不完全的!没有构造函数等! 2.struct的申明 [php] package main import "fmt" type Person struct { Age int Name string } func main() { //初始化两种 a := Person{} a.Age = 2 a.Name = "widuu" fmt.Println(a) b := Person{ Age: 24, Name: "widuu", } fmt.Println(b) } [/php] 3.go指针操作 如下我们要...阅读全文

详解Go语言的内存模型及堆的分配管理

前言 这篇文章主要介绍Go内存分配和Go内存管理,会轻微涉及内存申请和释放,以及Go垃圾回收。从非常宏观的角度看,Go的内存管理就是下图这个样子,我们今天主要关注其中标红的部分。 Go这门语言抛弃了C/C++中的开发者管理内存的方式,实现了主动申请与主动释放管理,增加了逃逸分析和GC,将开发者从内存管理中释放出来,让开发者有更多的精力去关注软件设计,而不是底层的内存问题。这是Go语言成为高生产力语言的原因之一。 我们不需要精通内存的管理,因为它确实很复杂,但掌握内存的管理,可以让你写出更高质量的代码,另外,还能助你定位Bug。这篇文章采用层层递进的方式,依次会介绍关于存储的基本知识,Go内存管理的 “前辈” TCMalloc,然后是Go的内存管理和分配,最后是总结。这么做的目的是,希望各位能...阅读全文

博文 2019-08-05 23:04:24 零壹技术栈

elk基于jolokia监控springboot应用jvm方案

目前大部分应用都采用springboot 的方式部署,springboot 采用jar包发布,而jvm的运行状态又比较关键,因此用elk对jvm监控进行了集成,步骤如下: 一 springboot 项目配置 对于springboot项目,需要的配置是在pom文件里面增加对jolokia的支持: org.springframework.boot spring-boot-starter-actuator org.jo...阅读全文

博文 2018-06-28 18:34:38 冬天里的懒喵

Go初探

官方网站:https://golang.org/ 标准库文档:https://golang.org/pkg/ 在线编码学习:https://play.golang.org/ PS:请自行FQ 简介安装Hello World 实例编译基础语法行分隔符注释标识符关键字数据类型指针类型(Pointer)数组(Array)结构化类型(struct)接口类型(interface)Map 类型Any类型类型转换类型增加方法变量作用域值类型和引用类型常量iota运算符运算符优先级条件与循环语句函数返回多个值参数匿名函数与闭包范围(Range)递归查询接口查询类型查询错误处理面向对象成员的可访问性封装继承多态goroutine和channel同步消息传递多个channel参考 简介 (大家好,我是go吉祥物...阅读全文

博文 2016-03-18 08:00:01 leestar54

Go语言的方法值和方法表达式

// code_20_struct_method_expression project main.go package main import ( "fmt" ) //方法表达式:也即“方法对象赋值给变量” //两种使用方式: //1)隐式调用, struct实例获取方法对象---->方法值 //2)显示调用, struct类型获取方法对象, 须要传递struct实例对象作为参数。---->方法表达式 type Person struct { name string sex byte age int } func (p *Person) PrintInfoPointer() { fmt.Printf("%p, %v\n", p, p) } func (p Person) PrintInfoV...阅读全文

博文 2018-10-05 20:35:12 ck_god

关于go语言的闭包

package main import ( "fmt" ) func main() { var fs = [4]func(){} for i := 0; i < 4; i++ { defer fmt.Println("defer i = ", i) defer func() { fmt.Println("defer_closure i = ", i) }() fs[i] = func() { fmt.Println("closure i = ", i) } } for _, f := range fs { f() } } 这两天有时间学习了一下go语言。挺有趣的。 上面这段代码是关于closure和defer的用法。 go语言支持闭包,如果你在闭包函数中使用了上层函数的变量,那么这个变量的一...阅读全文

博文 2014-12-21 08:00:02 freshunter

golang slice 和 string 重用

相比于 c/c++,golang 的一个很大的改进就是引入了 gc 机制,不再需要用户自己管理内存,大大减少了程序由于内存泄露而引入的 bug,但是同时 gc 也带来了额外的性能开销,有时甚至会因为使用不当,导致 gc 成为性能瓶颈,所以 golang 程序设计的时候,应特别注意对象的重用,以减少 gc 的压力。而 slice 和 string 是 golang 的基本类型,了解这些基本类型的内部机制,有助于我们更好地重用这些对象 slice 和 string 内部结构 slice 和 string 的内部结构可以在 $GOROOT/src/reflect/value.go 里面找到 type StringHeader struct { Data uintptr Len int } type...阅读全文

博文 2018-03-17 17:34:37 hatlonely

为什么我要选择erlang+go进行服务器架构(2)

创文章,转载请注明出处:服务器非业余研究http://blog.csdn.net/erlib 作者Sunface 为什么我要选择Erlang呢? 一、erlang特别适合中小团队创业: erlang有异常成熟、经过电信级别大规模验证的OTP应用库,只需要很简单的代码就能建立起异常稳定、容错性强、扩展性强、高并发的服务器框架,这也是erlang最宝贵的核心价值所在。 二、erlang是天生的并发语言: erlang的并发特性是语言级别的,从开发伊始就采用了CSP并发模式, 以进程为单位,进程间没有共享内存,变量不可变的实现方式保证了无锁的并发模型,因此也是异常高效的,换句话说:你只要像平常一样写代码就能并发,完全不用操心任何底层实现,你的代码能完美的并行运行在多核服务器上,如果你能写出漂亮的并...阅读全文

博文 2014-12-15 21:00:01 iwvgbdni

30分钟上手GO语言--并发

并发 这一部分概览了 goroutein 和 channel,以及如何使用它们来实现不同的并发模式。 Gorutine:goroutine 是由 Go 运行时环境管理的轻量级线程。 go f(x, y, z) 开启一个新的 goroutine 执行 f , x , y 和 z 是当前 goroutine 中定义的,但是在新的 goroutine 中运行 `f`。goroutine 在相同的地址空间中运行,因此访问共享内存必须进行同步。sync 提供了这种可能,不过在 Go 中并不经常用到(用的是channel)。 package main import ( "fmt" "time" ) func say(s string) { for i := 0; ...阅读全文