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

从Golang Slice的内存泄漏来理解Slice的使用逻辑

Golang虽然是自带GC的语言,仍然存在内存泄漏的情况,这片文章总结了Golang中内存泄漏的情况。 其中Slice的内存泄漏是最容易中招的,看看这个PR: writev 的 leak,Golang官方都踩了坑。 本文将就其中的Slice内存泄漏的情况做分析,并介绍Slice实现和使用的一些关键逻辑。 Slice如何内存泄漏 Golang是自带GC的,如果资源一直被占用,是不会被自动释放的,比如下面的代码,如果传入的slice b是很大的,然后引用很小部分给全局量a,那么b未被引用的部分就不会被释放,造成了所谓的内存泄漏。 var a []int func test(b []int) { a = b[:1] return } 复制代码想要理解这个内存泄漏,主要就是理解上面的a = b[:1...阅读全文

博文 2020-03-18 10:34:30 排骨JZh

Golang并发和并行,内存分配及GC相关

并发(concurreny)和并行(parallellism) 并发是指两个或者两个以上的任务在一段时间内被执行,我们不关心这些任务在某一个时间点是否同时执行,可能同时执行也可能不是,我们只关心在一段时间内,是否执行解决了两个或者两个以上的任务 并行:两个或者两个以上的任务在同一时刻被执行 并发说的是逻辑上的概念,并行强调的物理运行状态,并发包含并行 Go实现了这两种并发形式:第一种是普遍认知的多线程共享内存, 还有一种就是csp并发模型,csp讲究通过通信共享内存 其实无论语言层面怎么实现到了操作系统层面,一定是通过线程的形态存在的,而操作系统根据访问权限的不同,体系架构可以分为用户空间和内核空间,内核空间主要负责访问cpu资源,io,内存等硬件资源,为上层应用提供最基础的基础资源,用户空...阅读全文

博文 2019-05-06 15:46:51 黑手党老k

golang学习之struct

结构体定义的一般方式如下: type identifier struct { field1 type1 field2 type2 ... } type T struct {a, b int} 也是合法的语法,它更适用于简单的结构体。 var t *T t = new(T) 变量 t 是一个指向 T的指针,此时结构体字段的值是它们所属类型的零值,使用 new 函数给一个新的结构体变量分配内存,它返回指向已分配内存的指针。 无论变量是一个结构体类型还是一个结构体类型指针,都使用同样的 选择器符(selector-notation) 来引用结构体的字段,即: type myStruct struct { i int } var v myStruct // v是结构体类型变量 var p *mySt...阅读全文

博文 2016-11-08 13:00:12 caiyezi

jvm垃圾回收算法

前言java相较于c、c++语言的优势之一是自带垃圾回收器,程序开发人员不用手动管理内存,内存的分配和释放完全由gc(Garbage Collector)来做,极大地提高了软件开发效率及程序健壮性(手动管理内存容易造成内存泄漏)。凡事皆有两面性,java gc在给我们带来内存管理便捷性的同时,也面临STW(Stop The World)影响程序吞吐的缺陷。作为java开发人员,只有深入理解jvm垃圾回收的机制,才能在程序性能出现瓶颈时,更好的对程序进行优化。欢迎学Java和大数据的朋友们加入java架构交流: 855835163群内提供免费的架构资料还有:Java工程化、高性能及分布式、高性能、深入浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点高...阅读全文

博文 2019-01-27 11:34:48 Java大生

「Go」- golang源码分析 - channel的底层实现

路径为:./src/runtime/chan.go 文件中,先看channel结构体: type hchan struct { qcount uint // total data in the queue 当前队列中的数据的个数 dataqsiz uint // size of the circular queue channel环形队列的大小 buf unsafe.Pointer // points to an array of dataqsiz elements 存放数据的环形队列的指针 elemsize uint16 // channel 中存放的数据类型的大小|即每个元素的大小 closed uint32 // channel 是否关闭的标示 elemtype *_type // e...阅读全文

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-09-04 12:05:49 hatlonely的小站

GO语言————4.9、指针

4.9 指针不像 Java 和 .NET,Go 语言为程序员提供了控制数据结构的指针的能力;但是,你不能进行指针运算。通过给予程序员基本内存布局,Go 语言允许你控制特定集合的数据结构、分配的数量以及内存访问模式,这些对构建运行良好的系统是非常重要的:指针对于性能的影响是不言而喻的,而如果你想要做的是系统编程、操作系统或者网络应用,指针更是不可或缺的一部分。由于各种原因,指针对于使用面向对象编程的现代程序员来说可能显得有些陌生,不过我们将会在这一小节对此进行解释,并在未来的章节中展开深入讨论。程序在内存中存储它的值,每个内存块(或字)有一个地址,通常用十六进制数表示,如:0x6b0820 或 0xf84001d7f0。Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。...阅读全文

博文 2019-04-22 01:32:38 fly_hps

golang 源码剖析(1): 运行初始化和包初始化

初始化中主要对命令行参数整理,环境变量设置,以及内存分配器,垃圾回收器,并发调度器的工作现场准备 基本概念 传统并发使用的是:多线程共享内存,go 使用的是CSP(communicating sequential processes)并发模型,以通信的方式来共享内存. go 中使用GPM方式来实现CSP,每个M关联一个P,,goroutine关联哪个P是无法控制的,P中维护了一个goroutin的列表,并用循环的方式取出一个G来关联上P来执行程序. // The main concepts are: // G - goroutine. // M - worker thread, or machine. // P - processor, a resource that is required...阅读全文

golang对共享内存的操作

不同进程间的内存是互相独立的,没办法直接互相操作对方内的数据,而共享内存则是靠操作系统提供的内存映射机制,让不同进程的一块地址空间映射到同一个虚拟内存区域上,使不同的进程可以操作到一块共用的内存块。共享内存是效率最高的进程间通讯机制,因为数据不需要在内核和程序之间复制。 共享内存用到的是系统提供的mmap函数,它可以将一个文件映射到虚拟内存的一个区域中,程序使用指针引用这个区域,对这个内存区域的操作会被回写到文件上,其函数原型如下: void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset); 参数fd为即将映射到进程空间的文件描述字,一般由open()返回,同时,fd可以指定为-1,此时须指定f...阅读全文

Go语言学习笔记2/2

chap04 并发编程 1.Go语言支持语言级别轻量级别线程,称之为goroutine,由Go语言运行时runtime管理。如下多线程实例: package main import ( "fmt"; "sync"; "runtime" ) var counter int = 0 func Count(lock *sync.Mutex){ lock.Lock() counter++ fmt.Println(counter) lock.Unlock() } func main(){ lock:=&sync.Mutex{} for i:=0;i<10;i++ { go Count(lock) } for { lock.Lock() c:=counter lock.Unlock() runtime....阅读全文

彬哥笔记 --17 Go语言 游戏服务器slice使用

大家好,我是彬哥,本节给大家讲下go语言服务器游戏slice处理相关,抛砖引玉了,主要是针对Go语言游戏服务器开发slice使用。 首先 先给大家看了小demo,LollipopGo框架版本v1.0.20190104 ,斗兽棋初始化棋盘demo代码如下: package main import ( "LollipopGo/LollipopGo/util" "Proto/Proto2" _ "binge/db" "fmt" ) var DSQ_qinei = []int{ // 1-8 A ;9-16 B ; 17 未翻牌; 18 已翻牌 Proto2.Elephant, Proto2.Lion, Proto2.Tiger, Proto2.Leopard, Proto2.Wolf, Proto...阅读全文

博文 2019-01-07 23:34:40 Golang语言社区

golang channel 使用总结

不同于传统的多线程并发模型使用共享内存来实现线程间通信的方式,golang 的哲学是通过 channel 进行协程(goroutine)之间的通信来实现数据共享: > Do not communicate by sharing memory; instead, share memory by communicating. 这种方式的优点是通过提供原子的通信原语,避免了竞态情形(race condition)下复杂的锁机制。 channel 可以看成一个 FIFO 队列,对 FIFO 队列的读写都是原子的操作,不需要加锁。对 channel 的操作行为结果总结如下: 操作 nil channel closed channel not-closed non-nil channel close p...阅读全文

golang第二天

测试代码 hello.go package main import "fmt" /** *该程序目的 * 学习go的复杂数据结构: 数组,指针,结构体,切片,集合 */ func main() { /** * 方式: var arrayName [len] type * 例: var nums [10] int * 声明一个数组和遍历它 */ var nums [10]int //声明一个数组 fmt.Println(len(nums)) fmt.Println(cap(nums)) for idx := 0; idx < len(nums); idx++ { fmt.Println(nums[idx]) } /** * 声明和初始化一起 */ var names = []string{"j...阅读全文

博文 2019-02-27 23:34:39 陌生人的头像

Go语言的栈空间管理

翻译原文链接 转帖/转载请注明出处 英文原文链接 发表于2014/09/15 在CloudFlare,我们使用Go语言搭建各种服务和应用。在这篇博文里,我们将对Go语言的技术特点进行深度分析。Go语言里最重要的一个特性就是goroutine。它们的开销比较小,相互协作地调度线程来运行。它们有广泛的用途,比如实现超时控制(timeouts),生成器(generators),以及在多个后台应用之间实现相互竞争(racing)。为了使goroutine能够适应更多的任务,我们必须保证每个goroutine占用很少的内存。同时,人们应该可以很方便地创建goroutine。 为了达到这些目标,Go语言管理的栈的方式看起来和其它很多语言一样,但是它的实现确实非常不同。 线程栈介绍 在我们开始讨论Go语言...阅读全文

博文 2017-08-13 05:35:01 曼托斯

Go unsafe.Pointer uintptr原理和玩法

载自: 你不知道的Go unsafe.Pointer uintptr原理和玩法 unsafe.Pointer 这个类型比较重要,它是实现定位和读写的内存的基础,Go runtime大量使用它。官方文档对该类型有四个重要描述: (1)任何类型的指针都可以被转化为Pointer (2)Pointer可以被转化为任何类型的指针 (3)uintptr可以被转化为Pointer (4)Pointer可以被转化为uintptr 大多数指针类型会写成T,表示是“一个指向T类型变量的指针”。unsafe.Pointer是特别定义的一种指针类型(译注:类似C语言中的void类型的指针),它可以包含任意类型变量的地址。当然,我们不可以直接通过*p来获取unsafe.Pointer指针指向的真实变量的值,因为我们...阅读全文

28.蛤蟆笔记go语言——并发简单示例

28.蛤蟆笔记go语言——并发简单示例 并发示例 package main import ( "fmt" "time" ) func ready(w string, sec int64) { secs :=time.Duration(sec) * time.Second time.Sleep(secs) fmt.Println(w,"is ready!") } func main() { goready("Tee", 2) goready("Coffee", 1) fmt.Println("I'mwaiting") secs :=time.Duration(2) * time.Second time.Sleep(5* secs) } 输出: I'mwaiting Coffeeis ready...阅读全文

博文 2016-09-07 05:00:33 notbaron

Go内存分配那些事,就这么简单!

文链接:https://mp.weixin.qq.com/s/3g... 新老朋友好久不见,我是大彬,这篇文章准备了很久,不是在拖延,而是中间做了一些其他事情,耽搁了一些。 这篇文章主要介绍Go内存分配和Go内存管理,会轻微涉及内存申请和释放,以及Go垃圾回收。 从非常宏观的角度看,Go的内存管理就是下图这个样子,我们今天主要关注其中标红的部分。 友情提醒:文章有点长,建议先收藏,后阅读,绝对是学习内存管理的好资料。 本文基于go1.11.2,不同版本Go的内存管理可能存在差别,比如1.9与1.11的mheap定义就是差别比较大的,后续看源码的时候,请注意你的go版本,但无论你用哪个go版本,这都是一个优秀的资料,因为内存管理的思想和框架始终未变。 Go这门语言抛弃了C/C++中的开发者管理...阅读全文

走进Golang之运行与Plan9汇编

本文目录速览: Golang的运行环境 内存 操作系统、CPU、内存互相配合 Go程序的调用规约 函数在栈上的分布 Go的调用实例 Go的汇编plan9 查看go应用代码对应的翻译函数 逃逸分析 传值还是传指针 总结 通过上一篇走进Golang之汇编原理,我们知道了目标代码的生成经历了那些过程。今天我们一起来学习一下生成的目标代码如何在计算机上执行。以及通过查阅 Golang 的 Plan9 汇编来了解Golang的一些内部秘密。 Golang的运行环境 当我们把编译后的Go代码运行起来,它会以进程的方式出现在系统中。然后开始处理请求、数据,我们会看到这个进程占用了内存消耗、cpu占比等等信息。本文就是要来解释在程序的运行过程中,内存、CPU、操作系统(当然还有其它的硬件,文中关系不大,就不...阅读全文

博文 2019-11-27 11:04:23 大愚Talk

为什么数组要从零开始?

如题,数组第一个元素为什么要从零开始,而不从一开始?感觉这很反人类呀,正常来讲,一个集合的开始,不应该从一吗? 对于这个问题,我觉得可以从以下两方面来考虑。 设计层面 我们先了解一下数组最基本的结构和寻址方式(即实现方式)。 现在市面上无论是C、Java、PHP,还是Go或者其他编程语言,他们数组的实现方式,应该都是一样的:一段连续的内存。 image 数组在分配内存的时候,我们会知道数组的开始地址(PS:在目前下标为零的情况下,也等同于数组的第一个元素的地址); image 因为数组中每个元素的类型都是相同的,所以每种类型所占的内存大小是固定的,因而导致数组中每个元素的所占的内存大小都是相同的 image 由此我们可以得出,数组中每个元素地址的计算公式: image // n为数组坐标,x...阅读全文

C实现的vector动态数组

动态数组vector是日常业务代码最常用的数据结构,大多数高级语言都提供了动态数组的实现, 如c++中的std::vector, python和golang中的[]。然而在c中没有提供这一重要的轮子,我们在这里一步一步构建一个c中的vector,可能不能在正式场景中使用,但是可以作为一个研习数据结构和内存分配的工具。 创建文件vector.h, vector.c,定义vector数据结构和init函数 //vector.h #ifndef VECTOR_H_ #define VECTOR_H_ #define INIT_CAP 10 typedef struct vector{ int cap; int len; void **items; }vector; void init_vec...阅读全文

博文 2019-04-21 11:34:40 Kevin_e8f2

理解真实世界的并发Bug

Go带来了新的并发原语和并发模式(其实也不太新),如果没有深入了解这些特性,一样会写出并发bug。 在 Understanding Real-World Concurrency Bugs in Go 这篇论文里,作者系统地分析了6个流行的Go项目(Docker、Kubernetes、gRPC-go、etcd、CockroachDB、 BoltD)和其中171个并发bug,通过这些分析我们可以加深对Go的并发模型的理解,从而产出更好、更可靠的代码。 Our study shows that it is as easy to make concurrency bugs with message passing as with shared memory,sometimes even more.我...阅读全文

从go语言中找&和*区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sybnfkn040601/article/details/54614798 *和&的区别 : & 是取地址符号 , 即取得某个变量的地址 , 如 ; &a *是指针运算符 , 可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 , 也就是这个地址所存储的值 . 从代码中验证 : 先构建一个Rect类型 : 1. &是取地址符号, 取到Rect类型对象的地址 2. *可以表示一个变量是指针类型(r是一个指针变量): 3.*也可以表示指针类型变量所指向的存储单元 ,也就是这个地址所指向的值 4.查看这个指针变量的地址 , 基本数据类型直接打印地址 摘自其他博客 : 经常会见到:...阅读全文

博文 2018-12-06 19:31:02 sybnfkn040601

golang string和[]byte的对比

golang string和[]byte的对比为啥string和[]byte类型转换需要一定的代价?为啥内置函数copy会有一种特殊情况copy(dst []byte, src string) int?string和[]byte,底层都是数组,但为什么[]byte比string灵活,拼接性能也更高(动态字符串拼接性能对比)?今天看了源码探究了一下。以下所有观点都是个人愚见,有不同建议或补充的的欢迎emial我aboutme何为string?什么是字符串?标准库builtin的解释:type string string is the set of all strings of 8-bit bytes, conventionally but not necessarily representin...阅读全文

博文 2017-10-04 00:00:02 zhangboyu

go 指针

指针 Go 拥有指针。指针保存了值的内存地址。 类型*T是指向T类型值的指针。其零值为nil。 var p *int &操作符会生成一个指向其操作数的指针。 i := 42p = &i *操作符表示指针指向的底层值。 fmt.Println(*p) // 通过指针 p 读取 i*p = 21 // 通过指针 p 设置 i 这也就是通常所说的“间接引用”或“重定向”。 与 C 不同,Go 没有指针运算 案例: package main import "fmt" func main() { i, j := 42, 2701 p := &i // 指向 i fmt.Println(*p) // 通过指针读取 i 的值 *p = 21 // 通过指针设置 i 的值 fmt.Println(i) //...阅读全文

《Go语言四十二章经》第二十二章 通道(channel)

《Go语言四十二章经》第二十二章 通道(channel) 作者:李骁 ## 22.1 通道(channel) Go 奉行通过通信来共享内存,而不是共享内存来通信。所以,**channel 是goroutine之间互相通信的通道**,goroutine之间可以通过它发消息和接收消息。 channel是进程内的通信方式,因此通过channel传递对象的过程和调用函数时的参数传递行为比较一致,比如也可以传递指针等。 channel是类型相关的,一个channel只能传递(发送或接受 | send or receive)一种类型的值,这个类型需要在声明channel时指定。 默认的,信道的存消息和取消息都是阻塞的 (叫做无缓冲的信道) 使用make来建立一个通道: ```go var channel...阅读全文

Go语言参数传递是传值还是传引用

本文为原创文章,转载注明出处,欢迎扫码关注公众号flysnow_org或者网站http://www.flysnow.org/,第一时间看后续精彩文章。觉得好的话,顺手分享到朋友圈吧,感谢支持。 对于了解一门语言来说,会关心我们在函数调用的时候,参数到底是传的值,还是引用? 其实对于传值和传引用,是一个比较古老的话题,做研发的都有这个概念,但是可能不是非常清楚。对于我们做Go语言开发的来说,也想知道到底是什么传递。 那么我们先来看看什么是值传递,什么是引用传递。 什么是传值(值传递) 传值的意思是:函数传递的总是原来这个东西的一个副本,一副拷贝。比如我们传递一个int类型的参数,传递的其实是这个参数的一个副本;传递一个指针类型的参数,其实传递的是这个该指针的一份拷贝,而不是这个指针指向的值。 ...阅读全文

博文 2018-10-17 19:40:37 飞雪无情

【Go语言】【12】GO语言的结构体

当我第一次接触到C语言时,就对结构体投入了极大的兴趣,认为这个东西以后大有作为,后来接触Java、C++,面向对象编程中的对象进入我的视线,经过了这么多年的磨练,回过头来再看结构体依旧是那么亲切;同时从另一个角度上看结构体与面向对象中的成员对象是多么的相像 :)一、结构体元素结构体由关键字、结构体类型名称和具体成员构成,如下:二、结构体初步认识下面通过对比数组(复合类型)来了解一下结构体:1、从存储类型来看数组只能存储相同的类型:s := []string{"a", "b", "c", "d", "e"}结构体可以存储不同的类型// 声明结构体type employee struct { name,address string // 姓名、住址 age int // 年龄 height,we...阅读全文

博文 2017-02-09 15:59:40 qingkechina

golang之slice剖析

一、概述 切片是 Go 中的一种基本的数据结构,使用这种结构可以用来管理数据集合。切片的设计想法是由动态数组概念而来,为了开发者可以更加方便的使一个数据结构可以自动增加和减少。但是切片本身并不是动态数据或者数组指针。切片常见的操作有 reslice、append、copy。与此同时,切片还具有可索引,可迭代的优秀特性。 1.切片和数组关于切片和数组怎么选择? 在 Go 中,Go 数组是值类型,赋值和函数传参操作都会复制整个数组数据。 1 func main() { 2 arrayA := [2]int{100, 200} // 定义数组并初始化内容 3 var arrayB [2]int // 定义一个数组 4 arrayB = arrayA 5 fmt.Printf("arrayA : %...阅读全文

博文 2019-03-11 22:34:39 神奇的考拉

2019-03-19

golang struct 类型 1.和其他语言一样(相当于java中的类),go语言也允许我们声明新的类型,定义struct: type typeName struct{ filedName type ...... } 例: type Person struct{ name string aget int } 2.自定义结构体赋值 2.1 按照顺序提供初始化值 p:=Person{"tom",25} 2.2 通过field:value的方式初始化 p := person{age:24, name:"Tom"} 3.struct的匿名字段 type Human struct { name string age int weight int } type Student struct { Hu...阅读全文

博文 2019-03-20 00:34:40 歼灭bug

2019-12-23 golang sclice补充

s2=s[x:y] 创建出的切片s2与s共享数组 那么s2的len cap分别是? s2的len=y-x cap=cap(s)-x 比如 s := make([]int, 30, 40) s2 := s[10:20] fmt.Println(len(s2)) // 10 fmt.Println(cap(s2)) // 30 s和s2共享的数组中10-19对s2可见 修改s2的某个值同时反应在s中 对于appends2的操作 上文中s2的cap=y-x 在cap的范围内append 修改的依然是共享数组 s2=append(s2,n) n会反映在s[20]上 替换s[20]的值 当append超过cap时s2底层指向一个新数组 容量提升25% s和s2分道扬镳 使用s2=s[x:y]这种形式创...阅读全文

博文 2019-12-23 17:32:58 nil_ddea

Rust内存分配器的不同行为

本文出自Rust内存分配器的不同行为,同步于Rust中文社区专栏:Rust内存分配器的不同行为 ,本文时间:2019-01-04, 作者:Pslydhh,简介:Pslydhh 欢迎加入Rust中文社区,共建Rust语言中文网络!欢迎向Rust中文社区专栏投稿,投稿地址 ,好文在以下地方直接展示, 欢迎访问Rust中文论坛,QQ群:570065685 Rust中文社区首页 Rust中文社区文章专栏 对于如下的代码,采用nightly version: use std::sync::mpsc; use std::thread; fn main() { const STEPS: usize = 1000000; thread::sleep(std::time::Duration::from_mil...阅读全文

博文 2019-01-04 23:34:46 krircc

谈 Golang 中的字符串和字节数组

Home Menu 谈 Golang 中的字符串和字节数组 11 Mar 2019 字符串 字节 Golang Go实现原理 编译原理 运行时 概述 结构 解析 操作 拼接 类型转换 总结 相关文章 Reference 字符串是 Go 语言中最常用的基础数据类型之一,虽然字符串往往都被看做是一个整体,但是实际上字符串是一片连续的内存空间,我们也可以将它理解成一个由字符组成的数组,Go 语言中另外一个与字符串关系非常密切的类型就是字节(Byte)了,相信各位读者也都非常了解,这里也就不展开介绍。 我们在这一节中就会详细介绍这两种基本类型的实现原理以及它们的转换关系,但是这里还是会将介绍的重点主要放在字符串上,因为这是我们接触最多的一种基本类型并且后者就是一个简单的 uint8 类型,所以会给予...阅读全文

博文 2019-03-19 12:14:33 draveness.me

goroutine理解

文链接 9.5 Go goroutine理解 Go语言最大的特色就是从语言层面支持并发(Goroutine),Goroutine是Go中最基本的执行单元。事实上每一个Go程序至少有一个Goroutine:主Goroutine。当程序启动时,它会自动创建。 为了更好理解Goroutine,现讲一下线程和协程的概念 线程(Thread):有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。 线程拥有自己独立...阅读全文

博文 2019-12-20 00:32:54 将军红

Golang使用QConf教程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuduorui/article/details/78117520 Golang使用QConf教程 QConf 是一个分布式配置管理工具。 用来替代传统的配置文件,使得配置信息和程序代码分离,同时配置变化能够实时同步到客户端,而且保证用户高效读取配置,这使的工程师从琐碎的配置修改、代码提交、配置上线流程中解放出来,极大地简化了配置管理工作。 关于QConf的详细介绍可以看这里github.com/Qihoo360/QConf。 特点 一处修改,所有机器实时同步更新 高效读取配置 安装部署方便,使用简单 服务器宕机、网络中断、集群迁移等异常情况对用户透明 支持c/c++、shell、php、pyt...阅读全文

博文 2019-01-10 17:31:36 xuduorui

指针的详细讲解

指针是一个代表着某个内存地址的值, 这个内存地址往往是在内存中存储的另一个变量的值的起始位置. Go语言对指针的支持介于Java语言和 C/C++ 语言之间, 它既没有像Java那样取消了代码对指针的直接操作的能力, 也避免了 C/C++ 中由于对指针的滥用而造成的安全和可靠性问题. ## 指针地址和变量空间 Go语言保留了指针, 但是与C语言指针有所不同. 主要体现在: - 默认值: nil. - 操作符 `&` 取变量地址, `*` 通过指针访问目标对象. - 不支持指针运算, 不支持 `->` 运算符, 直接用 `.` 访问目标成员. 先来看一段代码: ```go package main import "fmt" func main(){ var x int = 99 var p *...阅读全文

博文 2020-04-15 22:52:51 Conan_1996

数组与切片

[原文链接](https://yc90s.github.io/2017/11/20/%E6%95%B0%E7%BB%84%E4%B8%8E%E5%88%87%E7%89%87/) ## 数组 ### 定义 数组是一组同类型数据的集合,它是**值类型**,通过从0开始的下标索引访问元素值。初始化后**数组长度是固定的**,无法修改其长度。当作为方法的入参传入时將复制一份数组而不是引用同一指针。数组的长度也是其类型的一部分。 ### 初始化 - 长度为5的数组,其元素值依次为:1, 2, 3, 4, 5 ``` [5]int{1, 2, 3, 4, 5} ``` - 长度为5的数组,其元素值依次为:1, 2, 0, 0, 0. 在初始化时没有指定初值的元素將会赋值为其元素类型的默认值,int是0...阅读全文

博文 2017-11-21 12:36:16 yc90s

GO GC 垃圾回收机制

9.6 GO GC 垃圾回收机制 垃圾回收(Garbage Collection,简称GC)是编程语言中提供的内存管理功能。 在传统的系统级编程语言(主要指C/C++)中,程序员定义了一个变量,就是在内存中开辟了一段相应的空间来存值。由于内存是有限的,所以当程序不再需要使用某个变量的时候,就需要销毁该对象并释放其所占用的内存资源,好重新利用这段空间。在C/C++中,释放无用变量内存空间的事情需要由程序员自己来处理。就是说当程序员认为变量没用了,就手动地释放其占用的内存。但是这样显然非常繁琐,如果有所遗漏,就可能造成资源浪费甚至内存泄露。当软件系统比较复杂,变量多的时候程序员往往就忘记释放内存或者在不该释放的时候释放内存了。这对于程序开发人员是一个比较头痛的问题。 为了解决这个问题,后来开发出...阅读全文

博文 2019-02-17 18:00:57 guyan0319

GoLand中的指针操作 * 和 &

&和*这可能是Go中最令人困惑的事情之一。基本上你需要了解3个案例: &操作符 当你想获得变量的内存地址时,应该把&放到变量前面 *操作符 进入一个包含内存地址的变量并解析它,需要放到变量前面(因此它与&运算符相对应)。*它会指向指针指向的东西,例如myString。 myString := "Hi" fmt.Println(*&myString) // prints "Hi" 或更有用的,像 myStructPointer = &myStruct // ... (*myStructPointer).someAttribute = "New Value" * 在一个类型前面 当*放在类型前面时,例如*string,它成为类型声明的一部分,因此您可以说“此变量包含指向字符串的指针”。 所以令人...阅读全文

博文 2019-02-25 15:34:44 杨周龙

Go 并发模式

基本概念 了解并发和并行 并发:强调一段时间做多件事 并行:强调同一时间做多件事 CSP vs Actor 模型 Actor Actor 模型是一个通用的并发编程模型,可以应用在几乎任何一种编程语言中,典型的是 Erlang。多个 actor(进程) 可以同时运行、不共享状态、通过向与进程绑定的消息队列(也称为信箱)异步发送消息来进行通信。 actor-1 与 actor-2 进程通信依赖一个消息队列,而且消息队列与进程互相耦合绑定。actor-1 在发送完消息之后,在 actor-2 没有处理该消息的情况下,可以继续执行其他任务,这说明 actor 进程之间的通信是异步的。 优点 消息传输和封装,多个 Actor 可以同时运行,但不共享状态,而且单个 actor 中的事件是串行执行(这归功...阅读全文

博文 2020-02-26 10:34:37 咔叽咔叽

Golang learning 数组 切片(slice)

数组 切片(slice) 数组是值类型,切片是引用类型,虽然很像,但是本质不同。使用时注意不要用错 var a [2]int 数组初始化没有赋值,打印结果 [] 空值,不为nil fmt.Print(a) a := [2]int{1,2} 数组初始化赋值 fmt.Print(a) a := [2]int{1,2} 数组初始化赋值,指定数组个数 fmt.Print(a) a := [4]int{1,2:3} 数组指定下标位置初始化,未指定下标值默认0(type []int),打印结果[1 0 3] fmt.Print(a) a := [...]int{1,2} 编译器会按照数量确定数组长度 fmt.Print(len(a)) type Person struct { struct 类 name...阅读全文

博文 2019-05-13 19:34:52 wangyongyue

go内存分配机制-TCMalloc

golang的内存采用了TCMalloc 这种分配机制。go是在多种语言诞生N多年之后,才由几个大神开发的。每种语言都有自己的内存分配机制,那么作为后起之秀,go为什么选用TCMalloc呢?因为TCMalloc(Thread-Cache Malloc) 在内存分配上性能做的更好,而且对内存的利用率也有所提高。先简单说一下TCMalloc在这两方面是如何做到的? 性能提升主要从两点来看,第一点线程内部小对象的使用不存在锁竞争,减少了竞争带来的性能开销; 第二点内存大对象的分配直接在堆上,并且采用了自旋锁,某个线程等待另一个线程释放锁的时候,不会像传统互斥锁一样由运行态转到休眠态,等待线程一会处于忙等待,减少了线程状态的切换。 在内存利用率方面,区分了线程、central、heap三级,线程之...阅读全文

博文 2019-03-14 08:34:40 17freedom

DAY5 GOLANG(五)关于时间的函数

时间和日期的相关函数1)时间和日期函数now :=time.Now() //获取当前时间,可以通过now获取当前时间的年月日,时分秒fmt.Printf("now=%v \nnow type=%T\n",now,now)fmt.Printf("年=%v\n",now.Year())fmt.Printf("月=%v\n",now.Month())fmt.Printf("月=%v\n",int (now.Month())) //外面加一个int,把输出转换为整型fmt.Printf("日=%v\n",now.Day())fmt.Printf("时=%v\n",now.Hour())fmt.Printf("分=%v\n",now.Minute())fmt.Printf("秒=%v\n",now.S...阅读全文

博文 2019-10-31 22:33:35 aside section._1OhGeD

Golang之变量去哪儿?

写过C/C++的同学都知道,调用著名的malloc和new函数可以在堆上分配一块内存,这块内存的使用和销毁的责任都在程序员。一不小心,就会发生内存泄露,搞得胆战心惊。 切换到Golang后,基本不会担心内存泄露了。虽然也有new函数,但是使用new函数得到的内存不一定就在堆上。堆和栈的区别对程序员“模糊化”了,当然这一切都是Go编译器在背后帮我们完成的。 一个变量是在堆上分配,还是在栈上分配,是经过编译器的逃逸分析之后得出的结论。 这篇文章,就将带领大家一起去探索逃逸分析——变量到底去哪儿,堆还是栈? 什么是逃逸分析 以前写C/C++代码时,为了提高效率,常常将pass-by-value(传值)“升级”成pass-by-reference,企图避免构造函数的运行,并且直接返回一个指针。 你一...阅读全文

博文 2019-03-01 20:34:40 Stefno

OK

>Golang:**[通道,同步等待组 并发爬虫]()** 在Go的并发编程中有一句很经典的话:不要以共享内存的方式去通信,而要以通信的方式去共享内存。 在Go语言中并不鼓励用锁保护共享状态的方式在不同的Goroutine中分享信息(以共享内存的方式去通信)。而是鼓励通过channel将共享状态或共享状态的变化在各个Goroutine之间传递(以通信的方式去共享内存),这样同样能像用锁一样保证在同一的时间只有一个Goroutine访问共享状态。 当然,在主流的编程语言中为了保证多线程之间共享数据安全性和一致性,都会提供一套基本的同步工具集,如锁,条件变量,原子操作等等。Go语言标准库也毫不意外的提供了这些同步机制,使用方式也和其他语言也差不多。 ![image](https://upload...阅读全文

博文 2020-01-14 01:07:19 yiwanggecaonima

Golang学习笔记(一)

title: Golang学习笔记(一) date: 2019-05-16 21:28:57 tags: Go 语言(或 Golang)是 Google 在 2007 年开发的一种开源编程语言,于 2009 年 11 月 10 日向全球公布。Go 是非常年轻的一门语言,它的主要目标是“兼具 Python 等动态语言的开发速度和 C/C++等编译型语言的性能与安全性”。 简介 除了OOP外,近年出现了一些小众的编程哲学,Go语言对这些思想亦有所吸收。例如,Go语言接受了函数式编程的一些想法,支持匿名函数与闭包。再如,Go语言接受了以Erlang语言为代表的面向消息编程思想,支持goroutine和通道,并推荐使用消息而不是共享内存来进行并发编程。总体来说,Go语言是一个非常现代化的语言,精小但...阅读全文

【Golang进阶】指针的详细讲解

指针是一个代表着某个内存地址的值, 这个内存地址往往是在内存中存储的另一个变量的值的起始位置. Go语言对指针的支持介于Java语言和 C/C++ 语言之间, 它既没有像Java那样取消了代码对指针的直接操作的能力, 也避免了 C/C++ 中由于对指针的滥用而造成的安全和可靠性问题. 指针地址和变量空间 Go语言保留了指针, 但是与C语言指针有所不同. 主要体现在: 默认值: nil. 操作符 & 取变量地址, * 通过指针访问目标对象. 不支持指针运算, 不支持 -> 运算符, 直接用 . 访问目标成员. 先来看一段代码: package main import "fmt" func main(){ var x int = 99 var p *int = &x fmt.Println(p)...阅读全文

博文 2020-04-16 03:32:43 尹宁丶

golang中slice底层实现

什么是切片 切片就是我们经常所说的动态数组,可以灵活的增加和减少切片内的元素。 常见的切片操作有:reslice、append、copy 切片和数组该如何选择呢? 区别 切片是引用类型,数组是值类型。那么数组在复制和函数传参时候都是值复制。 优缺点 数组作为函数传参,当数组比较大时候往往会造成资源浪费。 切片是引用传递,所以它们不需要使用额外的内存并且比使用数组更有效率。 底层的数据结构 首先切片本身并不是动态数组或者数组指针,它是通过指针引用底层数组,本身是一个只读对象,其工作机制类似数组指针的一种封装。 切片数据结构定义: type slice struct { array unsafe.Pointer len int cap int } 切片的结构体由3部分构成,Pointer 是指向...阅读全文

博文 2019-12-18 14:33:43 化蝶飞618

有点不安全却又一亮的 Go unsafe.Pointer

在上一篇文章 《深入理解 Go Slice》 中,大家会发现其底层数据结构使用了 unsafe.Pointer。因此想着再介绍一下其关联知识 原文地址:有点不安全却又一亮的 Go unsafe.Pointer 前言 在大家学习 Go 的时候,肯定都学过 “Go 的指针是不支持指针运算和转换” 这个知识点。为什么呢? 首先,Go 是一门静态语言,所有的变量都必须为标量类型。不同的类型不能够进行赋值、计算等跨类型的操作。那么指针也对应着相对的类型,也在 Compile 的静态类型检查的范围内。同时静态语言,也称为强类型。也就是一旦定义了,就不能再改变它 错误示例 func main(){ num := 5 numPointer := &num flnum := (*float32)(numPoi...阅读全文

go-内存机制(3)

go的内存分配 Golang有一套自己的内存管理机制,自主的去完成内存分配、垃圾回收、内存管理等过程,从而避免频繁的向操作系统申请、释放内存,有效的提升go语言的处理性能。 Golang的内存管理是基于tcmalloc模型设计,但又有些差异,局部缓存并不是分配给进程或者线程,而是分配给P(Processor);Golang的GC是stop the world,并不是每个进程单独进行GC;golang语言对span的管理更有效率。 基本概念 1.Span span是golang内存管理的基本单位,每个span管理指定规格(以page为单位)的内存块,内存池分配出不同规格的内存块就是通过span体现出来的,应用程序创建对象就是通过找到对应规格的span来存储的, 下面我们看一下mspan的结构。...阅读全文

博文 2020-03-28 03:32:49 GGBond_8488