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

GO GC 垃圾回收机制

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

轻松理解Go函数传参内幕

一、内置类型作为参数传递 首先要明确一点:golang语言中是没有引用传递的 先上结论: golang的所有内置类型()作为函数参数传递都是传值的方式,需要注意的是:array、slice和map作为函数参数时也是传值,但是如果对结构内元素进行的修改,修改的是原数据。如果是对其进行整体赋值,则不会修改原数据,相当于拷贝出一个新的临时变量。通过传递指针参数实现修改原数据。 Go内置基础类型如下 布尔型:bool 整型:int int64 int32 int16 int8 uint8 uint16 uint32 uint64 uint 浮点型:float32 float64 复数型:complex64 complex128 字符串:string 字符型:rune 错误型:error 未命名类型:...阅读全文

数组、切片

引用 数组、字符串和切片 Go数组中的索引问题 深入解析 Go 中 Slice 底层实现 Golang 入门 : 切片(slice) 一、数组 var a [3]int // 定义长度为3的int型数组, 元素全部为0 var b = [...]int{1, 2, 3} // 定义长度为3的int型数组, 元素为 1, 2, 3 var c = [...]int{2: 3, 1: 2} // 定义长度为3的int型数组, 元素为 0, 2, 3 var d = [...]int{1, 2, 4: 5, 6} // 定义长度为6的int型数组, 元素为 1, 2, 0, 0, 5, 6 var e = [...]int{5, 4: 1, 0, 2: 3, 2, 1: 4} // 定义长度为6的...阅读全文

博文 2020-02-28 03:32:39 网管同学

golang 基础(12)指针

square-gopher.png 指针 在 go 语言中指针没有 c++ 中那么复杂,因为没有指针的运算。 什么时候用指针,也就是指针的用途 可能结构相对复杂数据你不想在程序中传递数据,可以通过传递地址 变量一致性 在多数语言中函数的参数传递有两种 值传递 值传递会保证没有 side effect,更改函数内的变量不会影响外面的变量 引用传递 go 语言中只有值传递一种方式 var cache Cache func f(cache Cache) 大家都知道值传递是将变量复制一份用于函数,那么对于我们定义类型,复杂数据结构的类型作为参数传递给函数时如果也需要复制一份,其实不是浪费吗,这里 cache 对象中一个指向内存保存对象的地址 pData ,复制仅是对象的内存地址。 ![images....阅读全文

博文 2019-03-17 20:34:42 zidea

Golang 中 new 和 make的区别

参考链接: https://studygolang.com/articles/24026#reply0 Golang 内置两个函数,new 和 make ,其作用都是用来分配内存的。这么说可能会造成混淆,但其实规则很简单,其实他们适用于不同的类型。 make 函数只用于给 slice、map、channel进行初始化; new 函数参数为 一个类型不是一个值,用该类型的零值初始化一块空间,并返回该空间的指针。 我们看一下下面的案例: package main import ( "fmt" ) func main() { var i *int *i=10 fmt.Println(*i) } 运行报错,panic: runtime error: invalid memory address or...阅读全文

博文 2019-10-17 16:33:04 aside section ._1OhGeD

【Go语言踩坑系列(九)】Channel(上)

声明 本系列文章并不会停留在Go语言的语法层面,更关注语言特性、学习和使用中出现的问题以及引起的一些思考。 我们知道,Go实现了两种并发形式,第一种是多线程共享内存,其实就是Java,C++等语言的多线程并发,通过锁来进行访问。另一种则是Go特有的CSP(communicating sequential processes)并发模型。 什么是CSP? CSP 是 Communicating Sequential Process 的简称,中文可以叫做通信顺序进程,是一种并发编程模型,由 Tony Hoare 于 1977 年提出。它是在串行时代提出的一个概念,慢慢的演化成了现在的一种并发模型。简单来说,CSP 模型由并发执行的实体(线程或者进程)所组成,实体之间通过发送消息进行通信,这里发送消...阅读全文

博文 2020-04-12 18:32:41 NoSay

深入理解 Go map:赋值和扩容迁移

深入理解 Go map:赋值和扩容迁移 概要 在 上一章节 中,数据结构小节里讲解了大量基础字段,可能你会疑惑需要 #&(!……#(!¥! 来干嘛?接下来我们一起简单了解一下基础概念。再开始研讨今天文章的重点内容。我相信这样你能更好的读懂这篇文章 哈希函数 哈希函数,又称散列算法、散列函数。主要作用是通过特定算法将数据根据一定规则组合重新生成得到一个散列值 而在哈希表中,其生成的散列值常用于寻找其键映射到哪一个桶上。而一个好的哈希函数,应当尽量少的出现哈希冲突,以此保证操作哈希表的时间复杂度(但是哈希冲突在目前来讲,是无法避免的。我们需要 “解决” 它) 链地址法 在哈希操作中,相当核心的一个处理动作就是 “哈希冲突” 的解决。而在 Go map 中采用的就是 "链地址法 " 去解决哈希冲突...阅读全文

博文 2019-03-26 09:29:56 EDDYCJY

Go

go 协程如何实现;使用的m:n调度模型,即任意数量的用户态协程可以运行在任意数量的线程上M:os线程(即操作系统内核提供的线程),G:goroutine,其包含了调度一个协程所需要的堆栈以及instruction pointer(IP指令指针),以及其他一些重要的调度信息。P:M与P的中介,实现m:n 调度模型的关键,M必须拿到P才能对G进行调度,P其实限定了golang调度其的最大并发度 2个M分别拿到context P在运行G,M只有拿到context P才能执行goroutine。被执行的goroutine在运行过程中调用 go func() ,会创建一个新的对应func() 的goroutine,并将这个goruotine加入到runqueue(就绪待调度的goroutine队列,...阅读全文

博文 2020-06-08 01:33:16 陈德华

空类的大小

空类就是没有任何数据成员的类,这种类占用的内存大小在不同的语言里面有不同的实现 c struct A {}; printf("sizeof(A): %lu\n", sizeof(struct A)); // sizeof(A): 0 这个结果输出是0,也就是说 c 语言中的空类大小为 0 struct A a1; struct A a2; printf("address(a1): %p\n", &a1); printf("address(a2): %p\n", &a2); printf("&a1 == &a2: %d\n", &a1 == &a2); // address(a1): 0x7ffdead15ff0 // address(a2): 0x7ffdead15ff0 // &a1 ==...阅读全文

Go 并发原理

Go语言是为并发而生的语言,Go语言是为数不多的在语言层面实现并发的语言;也正是Go语言的并发特性,吸引了全球无数的开发者。 并发(concurrency)和并行(parallellism) 并发(concurrency):两个或两个以上的任务在一段时间内被执行。我们不必care这些任务在某一个时间点是否是同时执行,可能同时执行,也可能不是,我们只关心在一段时间内,哪怕是很短的时间(一秒或者两秒)是否执行解决了两个或两个以上任务。 并行(parallellism):两个或两个以上的任务在同一时刻被同时执行。 并发说的是逻辑上的概念,而并行,强调的是物理运行状态。并发“包含”并行。 Go的CSP并发模型 Go实现了两种并发形式。第一种是大家普遍认知的:多线程共享内存。其实就是Java或者C++...阅读全文

内置函数

1. close:主要用来关闭channel 2. len:用来求长度,比如string、array、slice、map、channel 3. new:用来分配内存,主要用来分配值类型,比如int、struct。**返回的是指针** ``` i := 0 j := new(int) *j = 1 ```s1 := new([]int) s2 := make([]int, 10) fmt.Println(s1, " ", s2) 4. make:用来分配内存,主要用来分配引用类型,比如chan、map、slice **make和new的区别:make分配内存空间,返回的是一个值引用;new返回的是一个指针** ``` s1 := new([]int) s2 := make([]int, 10)...阅读全文

博文 2018-10-10 16:09:21 ace_kylin

JavaScript 形参与实参的爱恨情仇

作为前端开发,JavaScript 可谓是我们吃饭的家伙。 但我记得当我初学 JavaScript 的时候,总是搞不懂对形参的操作什么时候会影响到实参。 网络上关于这个问题众说纷纭,有说基本类型按值传递、复杂类型(对象、数组、函数等)按引用传递,更有人直接生造了一个词——按共享传递。 到底 JavaScript 的参数是按什么方式传递的呢? 考虑下面的例子: function addOne(num) { num += 1 } let n = 1 addOne(n) // n = ? 乍一看可能会觉得 n === 2 ,因为 num += 1 执行后 num 的值会变成 2。 但实际结果却是 n === 1,因为对形参的修改不会影响到实参的值。 按值传递?按引用传递? 再看另一个例子: fun...阅读全文

博文 2019-12-21 06:32:41 IdanLoo

golang 学习笔记 1.6 字符串

1.6 字符串 字符串是不可变值类型,内部用指针指向 UTF-8 字节数组。 默认值是空字符串 ""。 用索引号访问某字节,如 s[i]。 不能用序号获取字节元素指针,&s[i] 非法。 不可变类型,无法修改字节数组。 字节数组尾部不包含 NULL。 struct String { byte* str; intgo len; }; 使用索引号访问字符 (byte)。 s := "abc" println(s[0] == '\x61', s[1] == 'b', s[2] == 0x63) //输出: true true true 使用 " ` " 定义不做转义处理的原始字符串,支持跨行。 s := `a b\r\n\x00 c` println(s) // 输出: a b\r\n\x00 c...阅读全文

博文 2019-03-22 05:34:40 Diogoxiang

Golang 问题点(一)

1. make和new的区别: make和new都在堆上分配内存. 但是他们的行为不同, 适用于不同的类型. new(T) 返回的是T的指针, 其中T为一个类型, 不是一个值, 为T类型新值分配内存空间并将此空间初始化为T类型的的零值, 返回的是新值得地址,即T的指针*T的值, 该指针指向T的新分配的零值. make(T, args) 用来为slice,map货channel类型分配内存和初始化一个对象, 返回类型的引用we不是指针, 返回值根据T的不同而不同. 简单来讲: new 的作用是初始化一个指向类型的指针(*T),make 的作用是为 slice,map 或 chan 初始化并返回引用(T) testNew := new([2]int) fmt.Println(testNew) /...阅读全文

博文 2020-02-27 07:32:41 董小贱

第四章 数组、切片和映射 -- 数组

这一个节我们学习Golang中管理集合数据的三种数据结构:数组(Array)、切片(Slice)和映射(Map)。这三种数据结构是存储数据的基本数据结构,也是其他高级数据结构的底层实现;其中,数组又是切片和映射的基本数据结构。 数组 数组的内部实现 与C语言中类似,在Golang中的数组占用连续的内存分配,即数组中的元素在内存中是连续存储的。这样,数组元素的访问和修改操作都可以在O(1)时间内完成。 数组的声明 在Golang中任何变量在使用之前都需要声明,以此来分配内存空间和初始化值。 Golang中可以通过以下三种方式声明数组: 声明数组并初始化为零值 使用数组字面量声明并初始化数组 声明并指定特定位置元素的值(未指定位置的元素初始化为零值) 1.声明数组并初始化为零值 var arra...阅读全文

博文 2019-12-20 00:32:50 小黑随笔

简析Go与Java内存管理的差异

前 言 从实践中看,Golang(以下简称Go)应用程序比Java占用更少的内存,这与它们的运行时环境有关,其运行时自带了内存动态分配和自动垃圾回收的管理机制,本文通过分析Go与Java在内存管理机制上的差异,以期对两者在运行时内存方面有更进一步的认识。本文以Go(1.12)和当前使用较多的JDK8 HotSpot VM为例进行说明。本篇文章包含以下内容:介绍Go与Java的运行时内存结构差异介绍Go与Java的内存资源占用差异介绍Go与Java如何为对象分配内存介绍Go与Java的内存回收策略差异 内存结构差异应用程序要能在linux系统上运行(其他平台类似),其可执行文件要求符合ELF规范(Executable and Linkable Format,可执行和可链接格式)。操作系统加载目...阅读全文

博文 2019-06-11 17:32:56 安静的少女

golang 基础(30) WaitGroup

golang_real.jpg golang中有2种方式同步程序,一种使用channel,另一种使用锁机制。sync.WaitGroup只有3个方法,Add(),Done(),Wait()。其中Done()是Add(-1)的别名。简单的来说,使用Add()添加计数,Done()减掉一个计数,计数不为0, 阻塞Wait()的运行。 func main(){ go foo() go bar() } func foo(){ for i := 0; i < 45; i++{ fmt.Println("Foo",i) } } func bar(){ for i := 0; i < 45; i++{ fmt.Println("Bar:",i) } } var wg sync.WaitGroup func...阅读全文

博文 2019-04-03 08:34:38 zidea

3.2.7Golang的指针

总目录:https://www.jianshu.com/p/e406a9bc93a9 Golang - 子目录:https://www.jianshu.com/p/8b3e5b2b4497 指针 和C/C++的指针不同,go语言的指针不能进行偏移与运算,是安全指针。 我们在程序中定义任何量,在内存中都会有属于他的地址,这就是指针。 比如我定义了一个整数20,我在程序中把这个数赋值给变量A,把内存地址赋值给变量B。这时候变量B就是一个指针变量。通过变量A和变量B都能找到这个整数。 Go语言中的指针不能进行偏移和运算,因此Go语言中的指针操作非常简单,我们只需要记住两个符号:&(取地址)和*(根据地址取值) 指针地址 每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。 指针类型 G...阅读全文

博文 2020-03-17 23:32:47 寒暄_HX

Go goroutine理解

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

golang-channel

缓冲的 chan, make(chan int, 缓冲大小): 表示满了 缓冲大小后 就开始堵塞,无法在往 管道 塞入数据 不带缓冲区 chan,make(chan int) : 就是放入数据之后,没有取出这个数据就无法在继续放入数据 cap(ch1) 可以查看缓冲区长度 len(ch1) 可以查看缓冲区有多少未读的缓存数据 例子一 package main import ( "fmt" "time" ) // 理念:不要通过共享内存来通信;通过通信来共享内存 /** channel 例子一 channel 既然有了发送方, 就必须要有接收方!!! */ func worker(c chan int) { for { // 从 channel 里面获取数据,赋值给 n n := <-c fm...阅读全文

Golang 基础(三)

变量 声明变量的一般形式是使用关键字 var,例如: var indentifier type 例如: var a int var b bool var str string 或者 var ( a int b bool str string ) 当一个变量被声明后,系统自动对它进行赋值: int 为 0 float 为 0.0 bool 为 false string 为 空字符串 指针 为 nil 所有的内存在Go中都是经过初始化的,比如: 定义一个int类型的变量power,如果我们不给变量power指定值,Go会为变量power分配默认值0。 var power int // 定义power为0 var power int = 9000 // 赋值power为9000 对于变量的赋值而言...阅读全文

unsafe包的应用与字节对齐

以一个例子来说明: //misc.go package misc type S struct { i int32 k int8 j int64 } //main.go func main() { s := new(misc.S) //通过unsafe Pointer给未导出的字段赋值 //因为字节对齐,内存中实际分配 //int32|int8| int64 | //|xxxx|x---|xxxxxxxx| p := (*int32)(unsafe.Pointer(s)) *p = int32(10) // 1.unsafe Pointer和uintptr可以互相转换 // 2.unsafe Pointer和其他类型的指针可以互相转换 // 3.unsafe Pointer不能进行指针运算而u...阅读全文

博文 2019-01-02 18:34:45 Cedrus

兄弟连Go语言培训分享Struct结构体

兄弟连Go语言培训课程体系设计架构包括了区块链的基础语言Go语言、区块链后端技术体系、区块链公链、区块链分布式应用开发等内容讲解,以及到最后的面试指导和项目实战。课程由清华微软谷歌名师团队精心打造,历时半年时间共同研发而出。 先介绍一下go语言的类型系统 Golang中的类型系统 类型系统是指一个语言的类型体系结构。一个典型的类型系统通常包含如下基本内容: q基础类型,如byte、int、bool、float等; q复合类型,如数组、结构体、指针等; q可以指向任意对象的类型(Any类型); q值语义和引用语义; q面向对象,即所有具备面向对象特征(比如成员方法)的类型; q接口。 Go语言中的大多数类型都是值语义,并且都可以包含对应的操作方法。在需要的时候,你可以给任何类型(包括内置类型)...阅读全文

博文 2018-08-13 17:35:03 兄弟连区块链培训

golang并发编程tips

作为服务端的开发,最关注的就是并发编程,每个从java接触到golang的小伙伴应该都会有一些共同的困惑,做个总结 从java转到golang的一些类比: atomic.Value的用途和volatile类似 sync.Mutex、sync.RWMutex和ReentrantLock、ReentrantReadWriteLock类似 sync.WaitGroup和CountDownLauch类似 channel和future或者阻塞队列类似 sync.Map和ConcurrentHashMap类似 atomic包对应java的原子类 select特性没想到在java中有对应的东西,select加channel使用很广,配合default可以实现不阻塞,有很多妙用 sync.Once可以很方便...阅读全文

博文 2020-01-27 22:32:44 肥肥小浣熊

7. Go 语言数据类型:指针

Hi,大家好。 我是明哥,在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:golang.iswbm.com 我的 Github:github.com/iswbm/GolangCodingTime 0. 什么是指针 当我们定义一个变量 name var name string = "Go编程时光"复制代码 此时,name 是变量名,它只是编程语言中方便程序员编写和理解代码的一个标签。 当我们访问这个标签时,机算机会返回给我们它指向的内存地址里存储的值:Go编程时光。 出于某些需要,我们会...阅读全文

博文 2020-04-29 11:35:21 王一白

空类的大小

空类就是没有任何数据成员的类,这种类占用的内存大小在不同的语言里面有不同的实现 ## c ``` c++ struct A {}; printf("sizeof(A): %lu\n", sizeof(struct A)); // sizeof(A): 0 ``` 这个结果输出是0,也就是说 c 语言中的空类大小为 0 ``` c++ struct A a1; struct A a2; printf("address(a1): %p\n", &a1); printf("address(a2): %p\n", &a2); printf("&a1 == &a2: %d\n", &a1 == &a2); // address(a1): 0x7ffdead15ff0 // address(a2): 0...阅读全文

博文 2019-11-27 20:56:02 hatlonely

引用类型介绍

Golang的引用类型包括 slice、map 和 channel。它们有复杂的内部结构,除了申请内存外,还需要初始化相关属性。 内置函数 new 计算类型大小,为其分配零值内存,返回指针。而 make 会被编译器翻译 成具体的创建函数,由其分配内存和初始化成员结构,返回对象而非指针。 package main func main() { a := []int{0, 0, 0} // 提供初始化表达式。 a[1] = 10 b := make([]int, 3) // make slice b[1] = 10 c := new([]int) c[1] = 10 // ./main.go:11:3: invalid operation: c[1] (type *[]int does not s...阅读全文

博文 2019-02-21 01:34:44 weifansym

内存管理

Golang 的内存管理本质上就是一个内存池,只不过内部做了很多的优化。比如自动伸缩内存池大小,合理的切割内存块等等 内存池 golang的程序在启动初,会一次性向操作系统申请一大块内存,这块内存空间会放在一个叫 mheap 的 struct 中管理,mheap负责将这一整块内存分割成不同部分使用,并将其中一部分分割成合适大小分配给用户使用。 概念 page 内存页 span 内存块,一个或多个连续的 page 组成一个 span object 对象,用来存储一个变量数据,一个span会被分割成相同大小的object 假设 object 的大小是 16B,span 大小是 8K,那么就会把 span 中的 page 就会被初始化 8K / 16B = 512 个 object image.p...阅读全文

博文 2020-02-01 03:32:55 元气蛋蛋

探索 Go 语言数据类型的内部实现

向新程序员讲解 Go 语言的时候,必要的是解释 Go 各种数据值在内存中的组织来给他们建立正确的思想,知道哪些操作是开销昂贵的,哪些是不昂贵的。这篇文章就是关于基本类型,结构,数组和切片的内部实现原理。基本类型让我们从一个简单的例子开始 图1 变量 i 的类型是 int, 在内存中用一个32比特位的字来表示。j 的类型是 int32 ,由于显示类型转换。即使 i 和 j 由相同的内存布局,他们本质上还是不同的类型:在 Go 中直接 i = j 赋值将会产生一个错误,我们必须显示的转化 j,i = int(j)。值 f 的类型是 float,在内存中用 32 比特位的浮点值格式表示,它和 int32 有相同的内存使用量但是内部布局是不同的,感兴趣的可以去了解一个浮点数如何在内存中表示。结构体和...阅读全文

博文 2020-05-29 13:32:54 CXX_FLAGS

算法图解阅读笔记-选择排序

数组与链表 数组是连续内存的应用方式,它的特点就是所有的单元的内存地址都是连续的,当需要扩展而初始化的内存不足够的时候,就需要重新申请内存。 链表是已上一个元素指向来完成存储的,它在内存的存储是分散的,无论是添加还是删除较数组的最大优势就是都不需要整体动,只需要上一个元素的指向调整就好,缺点就是无法直接通过计算获得某个元素,如果要在链表中查找某一个元素,就需要遍历整个链表(最差情况) 选择排序 遍历所有元素,挑出最小的元素放在结果集中并删除该元素,直到要排序的数据集中没有元素为止。 golang版本 package main import "fmt" func main() { info := []int{12, 3, 54, 6, 6777, 2342, 234, 55, 6, 6777,...阅读全文

博文 2018-10-22 16:35:02 zhaoxi_yu

【Golang 基础】Go 语言的指针

Go 语言的指针   变量是一种使用方便的占位符,用于引用计算机地址,而在 Go 语言中可以通过 & 符号获取一个变量在计算机中对应的内存地址。 package basic import "fmt" func main(){ a := 1 fmt.Println(&a) // 0xc4200180a0 }   一个指针变量指向了一个值的内存地址。Go 语言中的指针语法与 C++ 类似,都是使用 * 符号声明指针变量; package basic import "fmt" func main(){ a := 1 var p *int = &a fmt.Printf("获取变量内存地址 %x\n", p) // 获取变量内存地址 c4200180a0 fmt.Printf("获取指针变量值 %v...阅读全文

博文 2019-03-21 01:34:40 龙泷VK

golang的string、map、sclie

slice 切片的原理 切⽚ ( slice ) 是Go中⼀种⽐较特殊的数据结构,这种数据结构更便于使⽤和管理数据集合。 切⽚是围绕动态数组的概念构建的,与数组相⽐切⽚的⻓度是不固定的,可以追加元素,在追加时可能使切⽚的容量增⼤。 Go中的切⽚作为函数参数不是地址传递 func Demo(slice []int) { slice = append(slice, 6, 6, 6) fmt.Println("函数中结果:", slice) } func main() { //定义⼀个切⽚ slice := []int{1, 2, 3, 4, 5} Demo(slice) fmt.Println("定义中结果:", slice) } 结果 函数中结果: [1 2 3 4 5 6 6 6] 定义中结...阅读全文

博文 2020-05-12 19:33:01 强某某

Go语言变量

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。变量可以通过变量名访问。Go 语言变量名由字母、数字、下划线组成,其中首个字母不能为数字。声明变量的一般形式是使用 var 关键字: var identifier type变量声明第一种,指定变量类型,声明后若不赋值,使用默认值。 var v_name v_typev_name = value第二种,根据值自行判定变量类型。 var v_name = value第三种,省略var, 注意 :=左侧的变量不应该是已经声明过的,否则会导致编译错误。 v_name := value// 例如 var a int = 10 var b = 10c := 10...阅读全文

Golang中make和new的区别

new:func new(Type) *Type 接受一个参数,这个参数是一种类型,而不是一个值,分配好内存后, 返回一个指向该类型内存地址的指针,这个指针指向的内容的值为该类型的零值。 对于不同的数据类型,零值的意义是完全不一样的。 比如,对于bool类型,零值为false;int的零值为0;string的零值是空字符串 make:func make(t Type, size ...IntegerType) Type 同样用于内存分配,但和new不同,make用于channel,slice和map的分配, 而且返回的类型就是这三个类型本身,而不是它们的指针, 因为这三种类型本身就是引用类型,所以就没必要返回他们的指针了。 具体而言,有如下几种用法: (1)make(map[string]s...阅读全文

博文 2020-04-18 17:32:50 普朗tong

【协程初步讨论 2019-4-24】 简单扩展

grape 全部视频:https://segmentfault.com/a/11... 原视频地址:https://biglive.xueersi.com/L... GO协程有关知识(扩展) Go语言最大的特色就是从语言层面支持并发(Goroutine),Goroutine是Go中最基本的执行单元。事实上每一个Go程序至少有一个Goroutine:主Goroutine。当程序启动时,它会自动创建。 首先了解什么是协程,什么是线程 协程:又称微线程与子例程(或者称为函数)一样,协程(coroutine)也是一种程序组件。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。和线程类似,共享堆,不共享栈,协程的切换一般由程序员在代码中显式控制。它避免了上下文切换的额外耗费,兼顾了...阅读全文

golang基础---Slice切片

切片Slice在go语言中是单独的类型(指向底层的数组),不同于python(对可迭代对象操作的工具),注意区分数组和slice的区别 定义一个空slice,格式var s []int,这种既没有长度也没有元素赋值的类型(相比叫array) 数组的基本操作如下 ,类似与python中列表切片的操作,详见实例 package main import "fmt" func main() { var s1 []int //这样就是一个slice类型,既没有长度也没有元素赋值 a := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //这是一个数组 s2 := a[5:10] //切片,索引5到10的元素,不包含索引为10 s3 := a[:3] //切片,索引1-3...阅读全文

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

Golang new和 make的区别

Go提供了两种分配原语,即new和make。它们所做的事情是不一样的,所应用的类型也不同。new用来分配内存,但与其他语言中的同名函数不同,它不会初始化内存,只会讲内存置零;也就是说,new(T)会为类型为T的新项分配已置零的内存空间,并返回他的地址,也就是一个类型为*T的值。用Go的术语来说,它返回一个指针,改指针指向新分配的,类型为T的零值;make的目的不同于new,它只用于slice,map,channel的创建,并返回类型为T(非指针)的已初始化(非零值)的值;出现这种差异的原因在于,这三种类型本质上为引用类型,它们在使用前必须初始化;小结:new和make都在堆上分配内存,但是它们的行为不同,适用于不同的类型。new(T) 为每个新的类型T分配一片内存,初始化为 0 并且返回类型...阅读全文

博文 2020-05-12 19:32:47 算法设计与分析

27. 学习 Go 协程:WaitGroup

Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:http://golang.iswbm.com我的 Github:github.com/iswbm/GolangCodingTime 在前两篇文章里,我们学习了 协程 和 信道 的内容,里面有很多例子,当时为了保证 main goroutine 在所有的 goroutine 都执行完毕后再退出,我使用了 time.Sleep 这种简单的方式。 由于写的 demo 都是比较简单的, sleep 个 1 秒,我们主观...阅读全文

博文 2020-06-04 09:32:42 Python编程时光

认识 Go 语言中的数组

数组是具有相同唯一类型的一组已编号且长度固定的数据项序列。 声明方式 在 Go 语言中,数组的声明方式为 var identifier [len]type。 声明时没有指定数组的初始化值,因此所有的元素都会被自动初始化为默认值 0。 // 声明一个数组 var a1 [5]int 复制代码Go 语言中的数组是值类型,因此还可以用 new 来创建: var a2 = new([5]int) 复制代码new 返回类型的指针,因此 a1 与 a2 的区别在于:a1 的类型为 [5]int,a2 的类型为 *[5]int。 初始化方法 我们通过在 {} 中填写初始化值来初始化数组。 指明数组长度 指明数组的长度 len,然后在 {} 中填写初始化值,这些值会按下标从小到大的顺序分配。 初始化值的个数...阅读全文

博文 2019-11-21 14:04:20 江不知

27. 学习 Go 协程:WaitGroup

Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:golang.iswbm.com 我的 Github:github.com/iswbm/GolangCodingTime 在前两篇文章里,我们学习了 协程 和 信道 的内容,里面有很多例子,当时为了保证 main goroutine 在所有的 goroutine 都执行完毕后再退出,我使用了 time.Sleep 这种简单的方式。 由于写的 demo 都是比较简单的, sleep 个 1 秒,我们主观上认为是够用...阅读全文

博文 2020-06-05 09:34:22 王一白

Go语言的Channel

什么是Channel Channel 是 Go 中为 goroutine 提供的一种通信机制,channel 是有类型的,而且是有方向的,可以把 channel 类比成 unix 中的 pipe。 channel的使用 channel创建 channel 字面意义是 “通道”,类似于 Linux 中的管道。声明 channel 的语法如下: chan T // 可以接收和发送类型为 T 的数据 chan<- float64 // 只可以用来发送 float64 类型的数据 <-chan int // 只可以用来接收 int 类型的数据 复制代码使用make初始化Channel,并且可以设置容量: make(chan int, 100) 复制代码因为 channel 是一个引用类型,所以在它被...阅读全文

博文 2020-06-07 12:34:22 隔壁小王_

探索 Go 语言数据类型的内部实现

向新程序员讲解 Go 语言的时候,必要的是解释 Go 各种数据值在内存中的组织来给他们建立正确的思想,知道哪些操作是开销昂贵的,哪些是不昂贵的。这篇文章就是关于基本类型,结构,数组和切片的内部实现原理。基本类型让我们从一个简单的例子开始​图1 变量 i 的类型是 int, 在内存中用一个32比特位的字来表示。j 的类型是 int32 ,由于显示类型转换。即使 i 和 j 由相同的内存布局,他们本质上还是不同的类型:在 Go 中直接 i = j 赋值将会产生一个错误,我们必须显示的转化 j,i = int(j)。 值 f 的类型是 float,在内存中用 32 比特位的浮点值格式表示,它和 int32 有相同的内存使用量但是内部布局是不同的,感兴趣的可以去了解一个浮点数如何在内存中表示。结构体...阅读全文

Golang package sync 剖析(二): sync.WaitGroup

一、前言 Go语言在设计上对同步(Synchronization,数据同步和线程同步)提供大量的支持,比如 goroutine和channel同步原语,库层面有 - sync:提供基本的同步原语(比如Mutex、RWMutex、Locker)和 工具类(Once、WaitGroup、Cond、Pool、Map) - sync/atomic:提供变量的原子操作(基于硬件指令 compare-and-swap) -- 引用自《Golang package sync 剖析(一): sync.Once》 上一期中,我们介绍了 sync.Once 如何保障 exactly once 语义,本期文章我们介绍 package sync 下的另一个工具类:sync.WaitGroup。 二、为什么需要 Wa...阅读全文

博文 2020-01-28 14:32:39 oscarzhao

初识Golang

日了个狗 之所以开始学习Golang,也是因为公司的新项目要求完全用golang来写。日了个狗的,公司全是PHP开发,这样急转弯式的切技术栈不知是福是祸。本打算写完C的笔记,就开始写计算机系统和操作系统,再然后写数据结构和算法,现在看来,得先开始写Golang了。 初识Golang golang没有类和继承的概念,多态是依靠接口实现。 golang自带编译器,完全支持UTF8。 golang被称为“next C”, 下一代的C语言。例如:保留指针,但默认阻止指针运算,将切片和字典作为内置类型。 golang运行时通过Goroutine来运行所有的一切,包括main.main。它将一切都并发化。 Go语言为并发而生 Go语言的并发是基于 goroutine 的,goroutine 类似于线程,...阅读全文

Go语言笔记:变量

变量指向一个内存地址,其中存储了某种类型的值。在静态语言中,此内存存储的变量类型不可变。 Go 中的变量如何声明? Go 变量声明可以指定哪些类型? Go 中如何实现类型的转换和断言? 1. Go 中的变量如何声明 使用 var 关键词声明变量,有以下几种可变形式: 简单的类型声明:var a int 声明并赋初值:var a int = 1 或 var a = 1 同时声明多个变量: var a, b = 1, 2 当声明初始值时,可以不用指定类型,Go 会根据赋值判断并自动定义变量的类型。 以下为变量声明的示例: package main import "fmt" func main() { var a int var b int = 2 var c = 3 var d, e = 4, ...阅读全文

Golang中make与new有何区别?

Golang中make与new有何区别? 一、前言 本文主要给大家介绍了Go语言中函数new与make的使用和区别,关于Go语言中new和make是内建的两个函数,主要用来创建分配类型内存。在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的规则很简单,下面我们就通过一些示例说明他们的区别和使用。 二、变量的声明 var i int var s string ​ 变量的声明我们可以通过var关键字,然后就可以在程序中使用。当我们不指定变量的默认值时,这些变量的默认值是他们的零值,比如int类型的零值是0,string类型的零值是"",引用类型的零值是nil。 对于例子中的两种类型的声明,我们可以直接使用,对其进行赋值输出。但是如果我们换成指针类型呢? test1.go package m...阅读全文

博文 2020-03-09 15:36:02 刘丹冰Aceld

在递归生成json路径时所遇到的Slice append操作的问题

我们的需求是为根据json每一个value生成从root到key的path (为了方便说明我们暂时不考虑数组的情况,只考虑object/number/bool/string) 举个例子,对于以下json字符串 { "a": { "b":{ "c":{ "d0": "d0", "d1": "d1", "d2": "d2" } } } } 我们希望最终生成以下形式 a.b.c.d0 = d0 a.b.c.d1 = d1 a.b.c.d2 = d2 为此我们我们定义了以下结构 type Entry struct{ path []string val interface{} } 然后我们通过定义一个递归的函数来执行以下 func RecurseJson(jsonObj interface{}, pa...阅读全文

博文 2019-08-12 11:32:43 Destiny池鱼

Golang之变量去哪儿?

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

博文 2019-03-02 12:07:25 饶全成

[Go 教程系列笔记]Interface 第二部分

Go 教程系列笔记 Interface 第一部分 Go 教程系列笔记 Interface 第二部分 Go 教程系列笔记 并发介绍 Go 教程系列笔记 goroutine(协程) Go 教程系列笔记 Channel 通道 Go 教程系列笔记 缓冲通道和工作池 Go 教程系列笔记 Select Go 教程系列笔记 Mutex(互斥锁) Go 教程系列笔记 结构而不是类-Go中的OOP Go 教程系列笔记 组合而不是继承-Go 中的 OOP Go 教程系列笔记 多态-Go 中的 OOP 使用指针接收器和值接收器实现接口 我们在第1部分中讨论的所有示例接口都是使用值接收器实现的。也可以使用指针接收器实现接口。在使用指针接收器实现接口时需要注意一些细微之处。让我们了解使用以下程序。 type Desc...阅读全文

博文 2019-08-14 16:02:42 xfstart07

Golang中make和new的区别

1:new:func new(Type) *Type 接受一个参数,这个参数是一种类型,而不是一个值,分配好内存后,返回一个指向该类型内存地址的指针,这个指针指向的内容的值为该类型的零值。对于不同的数据类型,零值的意义是完全不一样的。比如,对于bool类型,零值为false;int的零值为0;string的零值是空字符串2:make:func make(t Type, size ...IntegerType) Type,具体而言,有如下几种用法:(1)make(map[string]string):即缺少长度的参数,只传类型,这种用法只能用在类型为map或chan的场景(2)make([]int, 2):指定了长度,例如make([]int, 2)返回的是一个长度为2的slice(3)mak...阅读全文

博文 2020-04-17 07:32:44 普朗tong