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

golang-接口

Go语言规定,只要实现了接口里面的方法,就是该接口的实现类 接口变量里面有什么? 实现者的类型 和 实现者的指针 接口变量自带指针 接口变量同样采用值传递,几乎不需要使用接口的指针 指针接收者实现只能以指针方式使用;值接收者都可以用 定义一个接口 package main import ( "fmt" "interfaces/mock" "interfaces/real" "time" ) /** Go语言规定,只要实现了接口里面的方法,就是该接口的实现类 接口变量里面有什么? 实现者的类型 和 实现者的指针 接口变量自带指针 接口变量同样采用值传递,几乎不需要使用接口的指针 指针接收者实现只能以指针方式使用;值接收者都可以用 。。。。 type Retriever struct {} ty...阅读全文

博文 2019-12-17 22:32:42 爱吃豆包

三年Java开发工程师,面试电话接到手软,做到这些你也可以!

序言 对于职场来说,简历就如同门面。若是没想好,出了差错,耽误些时日倒不打紧,便是这简历入不了HR的眼,费力伤神还不能觅得好去处,这数年来勤学苦练的大好光阴,岂不辜负? 简历,简而有力。是对一个人工作经验的简单介绍。对公司而言,在挑选人才时,可以通过简历对人才有整体认识,减少人才误用的风险。而对于个人来说,借着撰写简历,重新经历自己的过去、审视收获和缺憾,为面谈预先作好准备,来找到一份适合自己的理想工资。 我整理了一些面试题,由于平台不能上传文件,需要的可以加我QQ交流群277763288,从里面获取文档,也欢迎招聘者,找工作的进群,给大家提供一个更大的平台(希望可以帮助到大家) ![image.png](https://static.studygolang.com/190221/c2b31...阅读全文

博文 2019-02-21 21:37:38 bianchenglangzi

【Java核心设计模式】DAO开发实战业务分析

课程介绍 本课程是由Java SE向Java WEB学习的过渡课程,为了更好的巩固Java SE中所学习到的各项技术,同时也为了更完整的阐述Java在整个项目开发中的核心意义,所以讲解了综合的DAO设计模式。 在学习本课程之前请确保已经学习了:《Oracle从入门到精通》、《Java8编程入门》、《Java8面向对象编程》、《Java8高级编程》几门课程,并且已经熟练的掌握了接口、类集、JDBC等技术的使用。 课时列表 • 课时1:软件分层设计 • 课时2:设计分析实例 • 课时3:程序开发准备(定义数据库连接类) • 课时4:程序开发准备(定义VO类) • 课时5:数据层设计与开发(定义数据层标准) • 课时6:数据层设计与开发(数据层...阅读全文

Golang 复合数据类型:方法

传统的面向对象编程 在面向对象编程(OOP)中,类与对象是面向对象编程的两个主要方面。一个类(Class)能够创建一种新的类型(Type),其中对象(Object)就是类的实例(Instance)。可以这样来类比:你可以拥有类型 int 的变量,也就是说存储整数的变量是 int 类的实例(对象)。 对象可以使用属于它的普通变量来存储数据。这种从属于对象或类的变量叫作字段(Field)。对象还可以使用属于类的函数来实现某些功能,这种函数叫作类的方法(Method)。这两个术语很重要,它有助于我们区分函数与变量,哪些是独立的,哪些又是属于类或对象的。总之,字段与方法通称类的属性(Attribute)。 方法 在 Golang 中,方法是作用在接收者(receiver)上的一个函数,接收者是某种类...阅读全文

博文 2020-06-03 15:32:41 sunlingbot

golang fmt(格式换 I O接口)

基本模式 fmt 方法可以大致分为 print, scan两类, 根据基础方法可以构建特定方法。 Print 将参数写入字符串或io.writer scan 从字符串或 io.Reader 读取指定数据, 并输出 Print Print 方法的几种模式 基础模式: [name] Print 返回默认格式化的字符串 写入模式: F[name] 返回写入字节 例如: Fprint 字符模式: S[name] 返回字符 例如: Sprint 模板模式: [name]f 根据模板格式化 例如: Printf 换行模式: [name]ln 输出后带换行 例如: Println 模式可组合, 例如 Fprintf, Sprintf Print 默认格式化,返回字符串 func Print(a ...in...阅读全文

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-11-27 18:34:42 Chole121

[Golang]设计模式实践:组合(Composite)

版权声明:本文为Sunface(孙飞)原创文章,转载请注明出处 https://blog.csdn.net/abv123456789/article/details/44195589 关于本系列这个系列首先是关于Go语言实践的。在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档、图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只能靠看标准库源代码自己琢磨,所以我特别想在这方面有一些收集和总结。然后这个系列也是关于设计模式的。虽然Go语言不是一门面向对象编程语言,但是很多面向对象设计模式所要解决的问题是在程序设计中客观存在的。不管用什么语言,总是要面对和解决这些问题的,只是解决的思路和途径会有所不同。所以我想就以经典的设计模式作为切入点来展开这个系列,毕...阅读全文

go 内存管理

内存分配步骤 go 给对象分配内存的主要流程: object size > 32K,则使用 mheap 直接分配。 object size < 16 byte,使用 mcache 的小对象分配器 tiny 直接分配。 (其实 tiny * 就是一个指针,暂且这么说吧。) object size > 16 byte && size <=32K byte 时,先使用 mcache 中对应的 size class 分配。 如果 mcache 对应的 size class 的 span 已经没有可用的块,则向 mcentral 请求。 如果 mcentral 也没有可用的块,则向 mheap 申请,并切分。 如果 mheap 也没有合适的 span,则向操作系统申请。 关键数据结构 mcache 我...阅读全文

博文 2019-12-10 17:33:14 斜不靠谱

go中设计模式之结构型模式

外观模式 1. 定义: 外部与一个子系统通信必须通过一个统一的对象进行,为子系统中的一组接口提供一致界面。 2. 代码示例: // 定义对外API type API interface { Test() } func NewAPI() API { return apiImpl{newMod()} } type apiImpl struct { m mod } func (a apiImpl) Test() { a.m.mod() } // 需要交互的内部模块 type mod interface { mod() } func newMod() mod { return modImpl{} } type modImpl struct { } func (m modImpl) mod() { }...阅读全文

博文 2019-06-20 17:03:16 wx5cf612fe3a728

Golang设计模式(工厂模式)

factory.go // factory package factory import ( "errors" "fmt" ) const ( Cash = 1 DebitCard = 2 ) type PaymentMethod interface { Pay(amount float32) string } func GetPaymentMethod(m int) (PaymentMethod, error) { switch m { case Cash: return new(CashPM), nil case DebitCard: return new(DebitCardPM), nil default: return nil, errors.New(fmt.Sprintf("Pay...阅读全文

博文 2019-06-23 12:32:38 FredricZhu

golang内存分配

Go语言内置运行时(就是runtime),不同于传统的内存分配方式,go为自主管理,最开始是基于tcmalloc架构,后面逐步迭新。自主管理可实现更好的内存使用模式,如内存池、预分配等,从而避免了系统调用所带来的性能问题。 1. 基本策略 每次从操作系统申请一大块内存,然后将其按特定大小分成小块,构成链表(组织方式是一个单链表数组,数组的每个元素是一个单链表,链表中的每个元素具有相同的大小。); 为对象分配内存时从大小合适的链表提取一小块,避免每次都向操作系统申请内存,减少系统调用。 回收对象内存时将该小块重新归还到原链表,以便复用;若闲置内存过多,则归还部分内存到操作系统,降低整体开销。 1.1 内存块 span:即上面所说的操作系统分配的大块内存,由多个地址连续的页组成; object:...阅读全文

博文 2019-12-28 19:02:49 33debug

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有什么不同?

随着Go语言自身的逐渐优化及Go语言社区的不断发展壮大,go吸引着越来越多的人们来学习,那么go是怎么样?作为编程语言,go有什么不同? 1.面向接口编程;2.使用组合的编程;3.正交性:语言设计的正交性,保证语言的稳定性和简单性;4.少即是多:有且仅有一种方法把事情做好做对;5.并发语言层面支持:并发更好利用多核,有更强的表现力来模拟真实世界;6.开放性:开源,语言的实现对程序员不是个黑盒子,任何想了解语言实现的人都可以参与进来。 Go 没有像JAVA一样,宗教式的完全面向对象设计;完全面向对象设计就是一刀切的宗教式的设计,但其并不能很好的表述这个世界,这就导致其表现力不足,最后通过设计模式和面向切面等设计技巧来弥补语言方面的缺陷;Go是面向工程的实用主义者,其糅合了面向对象的设计,函数式...阅读全文

博文 2019-11-19 15:56:16 zhouzhou2018

【Golang小知识】new与make的区别

定义 func new(Type) *Type func make(t Type, size ...IntegerType) Type 其中Type代表某一个数据类型。 区别 1.返回值 从定义中可以看出,new返回的是指向Type的指针。make直接返回的是Type类型值。 2.入参 new只有一个Type参数,Type可以是任意类型数据。make可以有多个参数,其中第一个参数与new的参数相同,但是只能是slice,map,或者chan中的一种。对于不同类型,size参数说明如下: 对于slice,第一个size表示长度,第二个size表示容量,且容量不能小于长度。如果省略第二个size,默认容量等于长度。 对于map,会根据size大小分配资源,以足够存储size个元素。如果省略siz...阅读全文

博文 2019-11-17 17:32:41 moonbamboo

【设计模式】【golang源码】 单例模式(Singleton Pattern)

单例模式目的:对象初始化成本比较高,防止一个被多次初始化。 var ( confOnce sync.Once // guards init of confVal via initConfVal confVal = &conf{goos: runtime.GOOS} ) // systemConf returns the machine's network configuration. func systemConf() *conf { confOnce.Do(initConfVal) return confVal ...阅读全文

博文 2019-10-12 14:32:47 山丘

内置函数

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

算法篇序章

1.为什么要学数据结构和算法 IT开发工作中,大部分人是从业务开发为出发点的,而业务开发首要的是需求、功能的实现。在项目的里程碑、发版deadline等目标的驱动下,开发同学们往往挣扎于业务苦海,少有时间去思考性能优化和底层调用,往往一套框架和工具拿来即用,CURD不要太舒服。这样的结果就是一方面,第三方API和框架工具的使用大大提升了开发人员的开发效率,但是另一方面,许多开发人员对底层原理和数据结构知之甚少,一旦工具调用出问题则一脸懵B,所谓的开发工程师,无非是API调用工程师。 工作多年,我经历了多次线上生产的性能问题,这些经历生产上一些性能问题往往都是开发同学在对代码细节上考虑不周引起的,而这些操作往往都是对底层逻辑不熟悉导致的,掌握好这些基础写出更加优秀的程序,排查问题时也知道所以然...阅读全文

博文 2018-11-02 13:34:42 YitaiCloud

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 董小贱

Java设计模式学习记录-模板方法模式

前言模板方法模式,定义一个操作中算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。模板方法模式概念介绍模板方法模式,其实是很好理解的,具体理解为,定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法结构即可冲定义该算法的某些特定步骤。模板方法模式是最为常见的设计模式之一,是基于继承的代码复用技术。架构师定义一套骨架,开发工程师按照骨架去实现具体的逻辑。举例在具体的项目中其实使用模板方法的场景有很多,就举我之间遇到过的一个场景吧,这是一个实际的项目,结合这个项目的中的场景可以引出模板方法模式的使用方法,在一个审批流程的项目,会有很多种的申请单,例如:出差申请单、请假申请单、采购申请单、付款申请单等等。每个申...阅读全文

博文 2018-10-22 17:19:34 Enjoyjava

简析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

阿里免费分享Java高级开发

课程介绍 当你已经熟练的掌握了面向对象中的各种概念后,是否会对这些知识是如何使用的产生浓厚的兴趣?本课程主要针对于已经掌握了JAVA核心开发技术的读者准备,讲解了JAVA多线程、常用类库、IO编程、网络编程、类集框架、JDBC等与Java实际应用有关的开发技术。 课程目标 • 掌握Java多线程开发、网络编程、JDBC等 适合人群 • Java开发者 课时列表 • 课时1:Eclipse开发工具(Eclipse简介) • 课时2:Eclipse开发工具(使用JDT开发程序) • 课时3:Eclipse开发工具(debug调试) • 课时4:Eclipse开发工具(junit测试工具) • 课时5:Java基础新特性(可变参...阅读全文

兄弟连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的引用类型包括 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

设计模式

课程使用语言 Java 1. Singleton 单例模式 保证在内存中只有一个实例。 1.1 饿汉式 类中定义出来此实例类型变量,并且设置为 私有 静态 和 final 的。(new 出实例。也可以用静态语句块方式定义) 类中将构造方法重写为 private 的,且不做任何事情。(其他人 New 不出来) 提供 public 方法返回此实例。 利用:JVM 每个 class 只会 load 到内存一次。 优点:简单实用,推荐使用。 缺点:类装载时就实例化了。(后来的懒加载是使用的时候加载,无此缺点。) 1.2 懒汉式 特点:什么时候用时什么时候初始化。 先声明一个实例(private static),但不初始化。 重写构造方法为 private 的。 在 getInstance 中判断实例...阅读全文

博文 2020-04-05 02:32:42 Robin92

探索 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设计模式——单例模式

要点:sync.Once 的应用高并发场景下读写锁 package singleton import "sync" var ( p *Pet once sync.Once ) func init(){ once.Do( func() { p = &Pet{} }) } func GetInstance() *Pet{ return p } type Pet struct { Name string Age int m sync.Mutex } func (p *Pet)GetName()string{ return p.Name } func (p *Pet) GetAge() int{ return p.Age } func(p *Pet) SetName(name string) { p...阅读全文

博文 2020-05-19 05:33:44 筑梦攻城狮

面向对象的设计过程

前言 我一直认为分享的目的不是炫技。 一是,自我学习的总结。 二是,降低他人的学习成本。 三是,别人对自己学习结果的审核。 同时,本次分享有下面四个要素: 观点 本次分享的观点是一个软件工程中的思维方法,不限于编程语言 探讨 我可能理解错的,或者大家没理解的,欢迎大家积极评论,尽可能多互动,目的增加理解 理解 真的希望大家能理解 运用 最重要的,如果你觉着有帮助,一定要去在实际业务中实战 背景 工作中,几乎大家经常抱怨别人写的代码: 没法改 耦合高 无法扩展 今天就来探讨如何克服上面的问题~ 场景 首先问个问题: 平常工作中来了一个业务需求,我们是如何开始写代码的? 我推测大多数人可能: 1、梳理业务 2、设计数据库、接口、缓存 3、评审 4、于是就开始了 怎么怎么样...如果怎么怎么样.....阅读全文

博文 2019-11-18 23:03:05 TIGERB

Go内存管理之TCMalloc

自公众号:灰子学技术,原文链接:https://mp.weixin.qq.com/s/-b26YiHjL3V9CNvk0LZmEgTCMalloc作为Go语言内存管理的核心算法,是理解和掌握Go的内存管理非常重要的一步,本章主要介绍TCMalloc的是什么样子的。TCMalloc的概述 TCMalloc全称是Thread-Caching Malloc,是Google 开发的内存分配器,在不少项目中都有使用,例如在 Golang 中就使用了类似的算法进行内存分配。它具有现代化内存分配器的基本特征:对抗内存碎片、在多核处理器能够 scale。1. TCMalloc相比glibc 2.3而言内存分配更快。2.TCMalloc对于多线程程序而言,减少了锁机制,对于小对象而言,可以说没有锁的操作,对于...阅读全文

博文 2020-01-27 17:32:46 灰常出色

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 算法设计与分析

golang并发编程-20190624

进程 进程是操作系统进行资源分配的一个基本单元,由于描述程序执行的过程。 所有的进程都有父进程,所有的进程共同组成了一个树状结构 内核启动进程是所有进程的祖先,他自己作为自己的父进程 进程标识 内核对每个进程的属性和行为进行详细记录 pid就是这个唯一标识,pid为1的就是上面说的内核启动进程 image.png ppid就是当前进程的父进程 pid := os.Getpid() ppid := os.Getppid() 通过以上方法可以获取到对应的pid和ppid 进程空间 一个用户进程总会生存与用户的空间中 image.pn...阅读全文

代码组件 | 我的代码没有else

嗯,我的代码没有else系列,一个设计模式业务真实使用的golang系列。 系列全集 点这 前言 本系列主要分享,如何在我们的真实业务场景中使用设计模式。 本系列文章主要采用如下结构: 什么是「XX设计模式」? 什么真实业务场景可以使用「XX设计模式」? 怎么用「XX设计模式」? 本文主要介绍「组合模式」如何在真实业务场景中使用。 什么是「组合模式」? 一个具有层级关系的对象由一系列拥有父子关系的对象通过树形结构组成。 组合模式的优势: 所见即所码:你所看见的代码结构就是业务真实的层级关系,比如Ui界面你真实看到的那样。 高度封装:单一职责。 可复用:不同业务场景,相同的组件可被重复使用。 什么真实业务场景可以用「组合模式」? 满足如下要求的所有场景: Get请求获取页面数据的所有接口 前端...阅读全文

博文 2020-04-08 20:34:23 TIGERB

图解Go语言内存分配

Go语言内置运行时(就是runtime),抛弃了传统的内存分配方式,改为自主管理。这样可以自主地实现更好的内存使用模式,比如内存池、预分配等等。这样,不会每次内存分配都需要进行系统调用。Golang运行时的内存分配算法主要源自 Google 为 C 语言开发的 TCMalloc算法,全称 Thread-CachingMalloc。核心思想就是把内存分为多级管理,从而降低锁的粒度。它将可用的堆内存采用二级分配的方式进行管理:每个线程都会自行维护一个独立的内存池,进行内存分配时优先从该内存池中分配,当内存池不足时才会向全局内存池申请,以避免不同线程对全局内存池的频繁竞争。为了更好的阅读体验,手动贴上文章目录: 基础概念Go在程序启动的时候,会先向操作系统申请一块内存(注意这时还只是一段虚拟的地址...阅读全文

博文 2019-03-14 01:34:40 ddu_sw

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

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

Golang之变量去哪儿?

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

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

代码组件 | 我的代码没有else

嗯,我的代码没有else系列,一个设计模式业务真实使用的golang系列。 前言 本系列主要分享,如何在我们的真实业务场景中使用设计模式。 本系列文章主要采用如下结构: 什么是「XX设计模式」? 什么真实业务场景可以使用「XX设计模式」? 怎么用「XX设计模式」? 本文主要介绍「组合模式」如何在真实业务场景中使用。 什么是「组合模式」? 一个具有层级关系的对象由一系列拥有父子关系的对象通过树形结构组成。 组合模式的优势: 所见即所码:你所看见的代码结构就是业务真实的层级关系,比如Ui界面你真实看到的那样。 高度封装:单一职责。 可复用:不同业务场景,相同的组件可被重复使用。 什么真实业务场景可以用「组合模式」? 满足如下要求的所有场景: Get请求获取页面数据的所有接口 前端大行组件化的当今...阅读全文

博文 2020-04-11 20:32:47 TIGERB