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

设计模式-03-生成器模式

生成器模式概述生成器模式将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。生成器模式的主要功能是构建复杂的产品,而且是细化地、分步骤地构建产品,也就是说生成器模式重在一步一步解决构建复杂对象的问题。 实现使用文件的导出来实现生成器模式。文件的导出有普通文本和xml等文件格式。生成器作为一个接口,不同的具体生成器具体实现接口的方法。还有一个指导者负责整体构建的算法部分,是相对不变的部分。 总结与分析生成器模式构建对象的过程是统一的、固定不变的,变化的部分放到生成器部分了,只要配置不同的生成器,那么同样的构建过程,就能构建出不同的产品来。生成器模式的重心在于分离构建方法和具体的构造实现,从而使得构建算法可以重用。具体的构造实现可以很方便地扩展和切换,从而可以灵活地组合来构...阅读全文

博文 2019-04-10 20:34:40 疯狂的卡卡

PHP高级工程师学习和面试指南(转)

绝知此事须躬行。 为何写这篇文章。因为搜面试题搜到一篇# PHP高级工程师面试题 。看了看,有的会有的不会。想到自己也或多或少看过一些资料,故整理一下。 以下表中,资料列出的就够了。大都足以回答上面的面试题中的问题。 技能 资料 思考 php内核篇 《PHP7内核剖析》《PHP 7底层设计与源码实现》《PHP 7底层设计与源码实现》视频 尽量看细点。php7较之php5怎么节省内存的。比如php7 zvalue中复杂类型的用指针操作,也就是存个指针。php7快在哪里,小到string用了柔性数组,大到ast吧。这些话是我面试后的反思。我当时只是回答结构体设计不同。 php框架篇 《深入 Laravel 核心 》《BAT资深工程师由浅入深分析Tp5&Tp6底层源码》 自己用啥框架就找啥吧。 p...阅读全文

博文 2020-03-23 14:33:02 我是程序汪

单件模式——Golang实现

单件模式比较常见,算是创建型的设计模式,和工厂模式不同,他只能创建一个实例。他的应用场景很多,比如MySQL只能有一个实例这种都算。 单件模式能简单分成支持并发和不支持并发两种。不过并发这个很简单,满大街Golang实现的单件模式都是这样的。 普通的单件模式 package singleton import ( "fmt" ) var _self *Singleton type Singleton struct { Name string } func Instance() *Singleton { if _self == nil { _self = new(Singleton) return _self } return _self } func (o *Singleton) SetNam...阅读全文

博文 2017-02-09 12:25:33 Bryce

MaxCompute Console 实用小命令

摘要: MaxCompute Console 可以从 这里 下载。在阿里云官网可以查看 帮助文档。 这里跟大家分享一些 MaxCompute Console 中实用的小命令。 MaxCompute Console 可以从 [这里](http://repo.aliyun.com/odpscmd/?spm=a2c4e.11153959.blogcont61428.7.546b65c3f7Xooq) 下载。在阿里云官网可以查看 [帮助文档](https://help.aliyun.com/document_detail/27804.html?spm=a2c4e.11153959.blogcont61428.8.546b65c3f7Xooq)。 这里跟大家分享一些 MaxCompute ...阅读全文

如何把golang的Channel玩出async和await的feel

引言如何优雅的同步化异步代码,一直以来都是各大编程语言致力于优化的点,记得最早是C# 5.0加入了async/await来简化TPL的多线程模型,后来Javascript的Promise也吸取这一语法糖,在ES 6中也加入了async和await.那么,被大家一称赞并发性能好、异步模型独树一帜的golang,能否也有async和await呢?其实,这对于golang的CSM来说是一点也不难!核心代码如下: done := make(chan struct{}) go func() { // do work asynchronously here // close(done) }() <-done 是不是很简单呢? go rountine负责async, channel的负责await, 简直...阅读全文

博文 2020-02-27 16:32:50 Java天天

golang中的make与new

golang 中有两个内存分配机制 :new和make,二者有明显区别. new:new(T)分配了零值填充的T类型的内存空间,并且返回其地址,即一个*T类型的值。其自身是一个指针.可用于初始化任何类型 make: 返回一个有初始值(非零)的T类型,而不是*T,其只能用来初始化:slice,map和channel三种类型。 对比: 适用范围:make 只能创建内建类型(slice map channel), new 则是可以对所有类型进行内存分配 返回值: new 返回指针, make 返回引用 填充值: new 填充零值, make 填充非零值 代码: package main import ( "fmt" "reflect" ) type Books struct { Title, Co...阅读全文

互联网大厂必问面试合集,助你跳槽拿高薪--Java篇

前言作为程序员,免不了要经历面试这关,虽然平时工作勤勤恳恳,但是面试上面未必能展示的出来,比如平时都是做增删改查的业务系统,面试官非要问你如何处理高并发大数据,本来是写java代码,非要问你大型网站架构,这些问题防不胜防,本文就自己的面试经验来总结一下,抛砖引玉。第一步先自我介绍?介绍自己的项目经验和个人的擅长点,面试官主要考察你的表达能力和语言精简能力。第二步:项目中做了什么,难点在哪里?主要是想了解参与过技术难度最大的项目难点,技术难点在哪里,你是怎么来解决的,考察项目经验(技术难度)和解决问题的能力。第三步:开始切入技术面试正题:基础篇基本功面向对象特征final, finally, finalize 的区别int 和 Integer 有什么区别重载和重写的区别抽象类和接口有什么区别说...阅读全文

博文 2019-04-15 17:21:33 answer-A

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

三年Java开发工程师,面试电话接到手软

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

博文 2019-02-20 13:33:29 JavaWDB

入门goroutine并发设计模式以及goroutine可视化工具

Daisy-Chain 首先,为了防止过于枯燥,我先列出我最喜欢的一个模式:Daisy-Chain。这个模式比较复杂,对go的并发编程不太熟悉的同学,可以先看下面的模式。然后回过头来看这个。 daisy chain会创建很多channel,然后把这些channel首尾相接级联起来,组成一条单向链,每个channel都在处理不同的子任务,最后的结果在链的末端输出。这是在2012年的golang talks中由Rob Pike提出的: func f(left, right chan int) { // 这个函数就把right的输出和left的输入联系起来了。 left <- 1 + <-right } func main() { const n = 10000 leftmost := make(...阅读全文

博文 2017-02-10 10:27:57 flybywind

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的小站

golang: 使用 delve 调试 golang 程序

golang: 使用 delve 调试 golang 程序 猜你喜欢golang: 在 Golang 中使用 Go 关键字和 Channel 实现并行在 Golang 中使用 Go 关键字和 Channel 实现并行使用Golang语言实现一个简单的Bitcask引擎的文件存储系统安装 delve 官方的文档已经很全了,参考这里(github)安装。Mac OSX 比较麻烦,需要搞定证书。 断点和变量打印 delve 装好之后就可以直接在命令行使用 dlv 命令了。 查看可用的命令 dlv -h 看帮助信息可知:支持用 dlv attach 的方式调试正在运行的进程,支持 dlv connect 链接到网络端口调试。这里先用最简单的 dlv debug 调试。 dlv debug main....阅读全文

博文 2019-03-27 12:31:33 daisongwan

让Java程序员再次生机勃勃,还是技术的力量

大多数人选择Java可能只是因为听说Java前景好、Java比较好找工作、Java语言在TIOBE排行榜上一直位于前三等等之类的原因,但是Java真的还是之前那么好吗?答案是肯定的。 下面给大家分享一下阿里大牛整理的Java架构进阶技术知识导图 开源框架解析 学习 SSM 的基本用法能够帮助你完成绝大多数开发任务,掌握了高级用法能够提出更好的解决方案。学习框架没有捷径,在工作中一遍一遍地练习是唯一的方式。 很多人面试失败就败在原理上,只知其一,不是其二,稍微问的深入一点就答不上来了。理解原理就是理解 SSM 框架的灵魂,这也是一个程序员从体力劳动进阶到脑力劳动的门槛。 不理解原理只能做写代码的工具,理解原理才能成为真正的开发工程师。多思考、多总结、多请教,保持好奇心,多问一句是什么、为什么,...阅读全文

博文 2019-02-22 11:51:50 JavaWDB

golang

一、go基础 二、go应用 1 初级应用 1.1. 反射reflection 1.2. server服务 1.3. 文件操作 1.4. 终端读取 1.5. json协议 1.6. web模板 1.7. 时间处理 1.8. 锁机制 1.9. 原子操作 1.10. 加密解密 1.11. 日志包 1.12. 随机数验证码 1.13. 编码格式的转换 1.14. 常用算法 1.15. 限流器 2 高级应用 2.1. rpc 2.2. pprof 2.3. goim 2..4. gopush 2.5. cgo 2.6. Golang GC 2.7. 封装websocket 3 第三方应用库 3.1. cli应用 Cobra 3.2. 图标库 3.3. 开源IM 3.4. 机器学习库 3.5. 生成二维...阅读全文

博文 2019-06-13 22:32:41 yongfutian

Go 基础 3:error handling

官网: https://blog.golang.org/error-handling-and-go error对于常用类型,可以转换成某种interface去查里面具体错误。 对于repetive的error handling,可以做个wrap去handle统一的error,不过我个人觉得不是那么试用,很难有一个函数全部是一种类型的错误吧。不过这种是不是设计模式里的装饰者模式? 待读: https://dave.cheney.net/2016/04/27/dont-just-check-errors-handle-them-gracefully https://mijailovic.net/2017/05/09/error-handling-patterns-in-go...阅读全文

博文 2019-02-08 15:34:41 听海吹牛逼的声音

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++中的开发者管理...阅读全文

【深度知识】Go语言:启动和内存分配初始化

本文是 Golang 内部机制探索系列博客的后续。这个系列博客的目的是探索 Go 启动过程,这个过程也是理解 Go 运行时(runtime)的关键之处。本文中我们将一起去看看启动过程的第二个部分,分析参数是怎么被初始化的及其中有哪些函数调用等等。 启动顺序 我们从上次结束的地方继续。在 runtime.r0_to 函数中,我们还有一部分没有分析: CLD // convention is D is always left cleared CALL runtime·check(SB) MOVL 16(SP), AX // copy argc MOVL AX, 0(SP) MOVQ 24(SP), AX // copy argv MOVQ AX, 8(SP) CALL runtime·args(...阅读全文

博文 2019-08-13 01:32:47 笔名辉哥

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

tcmalloc 介绍

go的内存管理和tcmalloc(thread-caching malloc)很像,不妨先看看tcmalloc的实现。 tcmalloc是什么tcmalloc是google推出的一种内存分配器,常见的内存分配器还有glibc的ptmalloc和google的jemalloc。相比于ptmalloc,tcmalloc性能更好,特别适用于高并发场景。 tcmalloc具体策略tcmalloc分配的内存主要来自两个地方:全局缓存堆和进程的私有缓存。对于一些小容量的内存申请试用进程的私有缓存,私有缓存不足的时候可以再从全局缓存申请一部分作为私有缓存。对于大容量的内存申请则需要从全局缓存中进行申请。而大小容量的边界就是32k。缓存的组织方式是一个单链表数组,数组的每个元素是一个单链表,链表中的每个元素...阅读全文

博文 2017-07-02 19:24:21 Tao Kelu

观察者模式实战

本文转自“雨夜随笔”公众号,欢迎关注。 在上一篇文章中,我们简单了讲了一下设计模式和观察者模式。那么这次让我们详细了解一下观察者模式和我们如何进行使用。 内容 还记得上一篇文章中,我们说过了解或者设计一个设计模式的时候,要按照下面四点进行分析: image.png 意图 在实际业务场景中,我们经常遇到这样的稳定,也就是在某个对象发生某种事件时,通知其他相关的对象。所以观察者模式就允许你定义一种订阅机制,使得订阅某种事件的对象能够在事件发生时得到通知。 动机 我们来分析一种常见的业务场景,也就是购物APP中经常遇到的货物上架提醒,如果为了实现这种需求,我们可以按照下面的方式来实现: 成本最低:我们知道在开发中成本最低的就是不做这个需求,当然这个是开玩笑,不过一般在开发初期,我们可能会分析需求的...阅读全文

博文 2020-05-03 12:32:44 soolaugust

Golang 设计模式之-装饰模式

Golang 设计模式之-装饰模式 最近在温习设计模式,虽然面向对象不是go的特长,但用go实现的设计模式,比java 和 c# 这种纯面向对象语言多了一份灵活,比python 这种虚假的面向对象要更直观, 性能上也更有优势. 装饰模式 装饰模式是一个非常常用的设计模式。常用到python内置了它。 装饰模式是为已有功能动态的添加更多功能的一种方式, 降低了主类(当然,go里没有类这种东西,可以用结构模拟)复杂度, 防止类的爆炸行为. 当新加的功能仅仅是满足某种特定条件下的需要时,装饰模式是个非常好的选择。 装饰模式把核心功能和装饰功能区分了,减少了核心功能可能造成的冗余和耦合,简化核心类的重复装饰逻辑. 装饰模式的装饰顺序很重要,它决定了最终类被装饰的效果 实例 Decorate 抽象 t...阅读全文

博文 2020-05-07 15:41:19 trump2018

Golang单例模式(非线程安全)

singleton.go // singleton.go package singleton type singleton struct { count int } var instance *singleton func GetInstance() *singleton { if instance == nil { instance = new(singleton) } return instance } func (s *singleton) AddOne() int { s.count++ return s.count } func (s *singleton) GetCount() int { return s.count } singleton_test.go // singlet...阅读全文

博文 2019-06-18 19:32:44 FredricZhu

Template Method in Golang

序言 随着容器云技术的不断成熟,微服务架构也变得越来越火。在微服务架构下,我们将原本单一的应用按照功能边界分解成一系列独立、专注的微服务。每个微服务对应传统应用中的一个组件,但是可以独立编译、部署和扩展。每个团队可以根据自身服务的需求和行业发展的现状,自由选择最适合的技术栈,比如编程语言和数据库。Golang语言这几年风华正茂,不仅kubernetes、 openshif和docker等容器云相关的开源项目的开发语言是Golang,而且很多对实时性要求不高的微服务团队也选择Golang作为主要开发语言。 在这个大背景下,笔者也开始了Golang之旅。Golang作为一门全新的静态类型开发语言,与既有的开发语言相比简洁、有趣却又超级强大,具备众多令人兴奋不已的新特性,其中最令笔者兴奋的两个特性...阅读全文

博文 2017-02-10 14:39:37 _张晓龙_

Java 进阶面试问题列表

面向对象编程的基本理念与核心设计思想解释下多态性(polymorphism),封装性(encapsulation),内聚(cohesion)以及耦合(coupling)。继承(Inheritance)与聚合(Aggregation)的区别在哪里。你是如何理解干净的代码(Clean Code)与技术负债(Technical Debt)的。描述下常用的重构技巧。阐述下SOLID 原则。其他的譬如 KISS,DRY,YAGNI 等原则又是什么含义。什么是设计模式(Design Patterns)?你知道哪些设计模式?你有了解过存在哪些反模式(Anti-Patterns)吗?你会如何设计登陆舰/数学表达式计算程序/一条龙?你知道哪些基本的排序算法,它们的计算复杂度如何?在给定数据的情况下你会倾向于使...阅读全文

博文 2018-10-10 21:06:05 Java007

Golang桥接模式将多个chan桥接成一个chan

bridges/bridges.go // bridges package bridges type BridgeO struct { } func NewBridge() *BridgeO { bridgeO := &BridgeO{} return bridgeO } func (bridgeO *BridgeO) OrDone( done, c <-chan interface{}, ) <-chan interface{} { valStream := make(chan interface{}) go func() { defer close(valStream) for { select { case <-done: return case v, ok := <-c: if ok...阅读全文

博文 2019-06-18 15:32:53 FredricZhu

月薪 50K 大牛整理!六大Java架构进阶技术模块,看完茅塞顿开!

大多数人选择Java可能只是因为听说Java前景好、Java比较好找工作、Java语言在TIOBE排行榜上一直位于前三等等之类的原因,但是Java真的还是之前那么好吗?​下面给大家分享一下月薪50K大牛整理的Java架构进阶技术知识导图开源框架解析学习 SSM 的基本用法能够帮助你完成绝大多数开发任务,掌握了高级用法能够提出更好的解决方案。学习框架没有捷径,在工作中一遍一遍地练习是唯一的方式。很多人面试失败就败在原理上,只知其一,不是其二,稍微问的深入一点就答不上来了。理解原理就是理解 SSM 框架的灵魂,这也是一个程序员从体力劳动进阶到脑力劳动的门槛。不理解原理只能做写代码的工具,理解原理才能成为真正的开发工程师。多思考、多总结、多请教,保持好奇心,多问一句是什么、为什么,才能探索到框架的...阅读全文

博文 2019-01-17 00:15:23 javajiaoliu

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

【每日笔记】【Go学习笔记】2019-01-04 Codis笔记

作者:谭淼 1、dlv的使用 dlv是调试go语言的工具,与gdb类似。下面是一些dlv的常用命令: (1)dlv attach pid:类似与gdb attach pid,可以对正在运行的进程直接进行调试(pid为进程号)。 (2)dlv debug:运行dlv debug test.go会先编译go源文件,同时执行attach命令进入调试模式,该命令会在当前目录下生成一个名为debug的可执行二进制文件,退出调试模式会自动被删除。 (3)dlv exec executable_file:直接从二进制文件启动调试模式。 调试命令(常用的为break,continue,next,print): 注意:dlv可以通过goroutines查看所有的协程,并通过“goroutine 协程号”来切换...阅读全文

博文 2019-01-06 23:34:44 LNMPR源码研究

如何把golang的Channel玩出async和await的feel

引言 如何优雅的同步化异步代码,一直以来都是各大编程语言致力于优化的点,记得最早是C# 5.0加入了async/await来简化TPL的多线程模型,后来Javascript的Promise也吸取这一语法糖,在ES 6中也加入了async和await. 那么,被大家一称赞并发性能好、异步模型独树一帜的golang,能否也有async和await呢? 其实,这对于golang的CSM来说是一点也不难! 核心代码如下: done := make(chan struct{}) go func() { // do work asynchronously here // close(done) }() <-done 复制代码是不是很简单呢? go rountine负责async, channel的负责a...阅读全文

博文 2020-02-11 11:34:19 raining1127

数组与切片

[原文链接](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 语言内存分配器的实现原理

本文节选自 Go 语言设计与实现的 7.1 节。阅读全书:https://draveness.me/golang/ 程序中的数据和变量都会被分配到程序所在的虚拟内存中,内存空间包含两个重要区域 — 栈区(Stack)和堆区(Heap)。函数调用的参数、返回值以及局部变量大都会被分配到栈上,这部分内存会由编译器进行管理;不同编程语言使用不同的方法管理堆区的内存,C++ 等编程语言会由工程师主动申请和释放内存,Go 以及 Java 等编程语言会由工程师和编译器共同管理,堆中的对象由内存分配器分配并由垃圾收集器回收。 不同的编程语言会选择不同的方式管理内存,本节会介绍 Go 语言内存分配器,详细分析内存分配的过程以及其背后的设计与实现原理。 7.1.1 设计原理 内存管理一般包含三个不同的组件,分...阅读全文

博文 2020-03-08 15:32:47 draveness

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

Golang适用的DTO工具

本文首发于我的博客:Golang适用的DTO工具,我同时在知乎专栏也发布了同样主题的文章,但是文章脉络更清晰一点(个人感觉),链接由此去知乎版本-Golang适用的DTO工具,逃~ DTO (Data Transfer Object) 是Java中的概念,起到数据封装和隔离的作用。在使用Golang开发Web应用的过程中,也会有类似的需求。先贴项目地址 github.com/yeqown/server-common/tree/master/dbs/tools 举个例子 现在有一个用户数据结构如下, type UserModel struct { ID int64 `gorm:"column:id"` Name string `gorm:"column:name"` Password stri...阅读全文

博文 2018-08-31 09:35:07 yeqown

2019-11-06(云原生第一课)

让应用更有弹性、容错性、观测性的基础技术,让应用更容易部署、管理的基础软件、让应用更容易编写、编排的运行框架等。 云原生技术元年。 kubernetes等云原生集成成为技术人员必修课。kubernetes与云原生架构。 【容器作为集装箱,可以保证应用在不同的环境中快速迁移,提高迭代的效率。但是如果要形成容器集团军,还需要一个集团军作战的调度平台,这就是 Kubernetes。它可以灵活地将一个容器调度到任何一台机器上,并且当某个应用扛不住的时候,只要在 Kubernetes 上修改容器的副本数,一个应用马上就能变八个,而且都能提供服务。 然而集团军作战有个重要的问题,就是通信。这里面包含两个问题,第一个是集团军的 A 部队如何实时地知道 B 部队的位置变化,第二个是两个部队之间如何相互通信。...阅读全文

博文 2019-11-08 03:32:45 更多精彩内容8 分钟入门 K8s | 详解容器基本概念独角的犀牛云原生周报:第 3 期米开朗基杨Docker容器实战(七) - 容器眼光下的文件系统JavaEdge如何创建一个安全的 Docker 基镜像希云Docker容器管理平台《Docker从入门到

一)golang的单例模式

在23种设计模式中,单例模式作为最普遍运用的设计模式之一,在软件开发中起着非常重要的地位。 应用场景:对资源单一且有严格控制的场景,例如. 数据库连接类对象:可一次创建,一直使用的类 在golang中的单例模式实现方式有多种,但需要效率的实现主要还是依赖于sync/Once实现,其实现原理主要是依赖于sync/atomic包的原子操作源代码如下 type Once struct { m Mutex done uint32 } func (o *Once) Do(f func()) { if atomic.LoadUint32(&o.done) == 1 { return } // Slow-path. o.m.Lock() defer o.m.Unlock() if o.done == 0 ...阅读全文

????设计模式-适配器模式-Adapter

????适配器模式-Adapter原文地址:https://github.com/mumushuiding/golang-design-pattern/tree/master/01_Adapter把一个"错误"的接口????转换为希望的形式。它处理的是????匹配问题。⚡️ 类图适配器模式中,建造一个适配器有两种可能性:⚡️ 基于类的适配器(简称类适配器);???? 基于对象的适配器(简称对象适配器);​​ ⚡️类适配器适配器的类实现调用接口targetInterface, 并把对适配器的调用委托给它所继承的对象targetClass.????参与者下面列出适配器模式的参与者:targetClass (需要被匹配的类). 类 targetClass 通过接口的方式operationB()对外...阅读全文

博文 2019-08-23 17:33:01 mumushuiding

代码模板 | 我的代码没有else

嗯,我的代码没有else系列,一个设计模式业务真实使用的golang系列。 前言 本系列主要分享,如何在我们的真实业务场景中使用设计模式。 本系列文章主要采用如下结构: 什么是「XX设计模式」? 什么真实业务场景可以使用「XX设计模式」? 怎么用「XX设计模式」? 本文主要介绍「模板模式」如何在真实业务场景中使用。 什么是「模板模式」? 抽象类里定义好算法的执行步骤和具体算法,以及可能发生变化的算法定义为抽象方法。不同的子类继承该抽象类,并实现父类的抽象方法。 模板模式的优势: 不变的算法被继承复用:不变的部分高度封装、复用。 变化的算法子类继承并具体实现:变化的部分子类只需要具体实现抽象的部分即可,方便扩展,且可无限扩展。 什么真实业务场景可以用「模板模式」? 满足如下要求的所有场景: 算...阅读全文

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

有关 strings.Builder 内存分配问题?

写到第十一个的时候,就发生了内存分配。为什么会这样? ```go func numAllocs(fn func()) uint64 { defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(1)) var m1, m2 runtime.MemStats runtime.ReadMemStats(&m1) fn() runtime.ReadMemStats(&m2) return m2.Mallocs - m1.Mallocs } func TestStrings_numAllocs(t *testing.T) { // Builder’s inner slice’s capacity: 10 // Builder’s ...阅读全文

图解Go语言内存分配

目录 基础概念 内存管理单元 内存管理组件 mcache mcentral mheap 内存分配流程 总结 参考资料 Go语言内置运行时(就是runtime),抛弃了传统的内存分配方式,改为自主管理。这样可以自主地实现更好的内存使用模式,比如内存池、预分配等等。这样,不会每次内存分配都需要进行系统调用。 Golang运行时的内存分配算法主要源自 Google 为 C 语言开发的TCMalloc算法,全称Thread-Caching Malloc。核心思想就是把内存分为多级管理,从而降低锁的粒度。它将可用的堆内存采用二级分配的方式进行管理:每个线程都会自行维护一个独立的内存池,进行内存分配时优先从该内存池中分配,当内存池不足时才会向全局内存池申请,以避免不同线程对全局内存池的频繁竞争。 基础概...阅读全文

博文 2019-03-13 10:51:27 qcrao-2018

载:深入 Go 内存分配超级棒的文章:Go 内存分配器可视化指南

载:深入 Go 内存分配超级棒的文章:Go 内存分配器可视化指南本文译者:coldnight译文原链接:https://github.com/coldnight/go-memory-allocator-visual-guide当我第一次开始尝试理解 Go 语言的内存分配器时,整个过程让我抓狂。一切看起来都像一个神秘的黑盒子。因为几乎所有技术魔法(technical wizardry)都隐藏在抽象之下,所以你需要一层一层的剥离才能去理解它。我们将通过这篇文章来一层层的剥离这些细节。如果你想学习所有关于 Go 内存分配器的知识,那么这篇文章正适合你。物理内存和虚拟内存每一个内存分配器都需要运行在由底层操作系统管理的虚拟内存空间(Virtual Memory Space)之上。下图是一个物理内存单...阅读全文

博文 2019-12-23 01:33:03 meng_philip123

Golang设计模式——工厂模式

package fatory import "fmt" type Device interface{ StartDevice() } type KeyBoard struct { } func (k *KeyBoard) StartDevice(){ fmt.Println("Keyboard is ready to work!") } type Mouse struct { } func (m *Mouse) StartDevice(){ fmt.Println("Mouse is ready to work!") } func NewDevice(device string)Device{ switch device{ case "k": return &KeyBoard{} case ...阅读全文

博文 2020-05-18 06:33:43 筑梦攻城狮

[译]Go:内存管理与内存分配

文:medium.com/a-journey-w… 这篇文章是基于Go 1.13的。 当内存不再被使用时,标准库就会自动执行Go内存管理,即从内存分配到Go自己的集合中(from allocation of the memory to its collection)。 虽然开发人员不用去和这些打交道,但是Go的内存管理做了很多优化以及有很多有趣的概念,所以也值得我们去探讨与学习。 堆上的分配 Allocation on the heap 内存管理是在高并发环境以及集成了垃圾回收功能上所设计的。我们来演示一些简单的例子: package main type smallStruct struct { a, b int64 c, d float64 } func main() { smallAll...阅读全文

博文 2019-11-26 18:34:24 野生程序元

[GO语言]Golang String字符串的操作大全

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

博文 2020-05-15 17:38:35 小龙in武汉

golang相关网摘

1、golang开发50个坑 http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/index.html#mline_lit_comma 2、golang二进制序列化与内存对齐 https://www.zhihu.com/question/27410178 3、大话设计模式(golang) http://www.oschina.net/code/list_by_user?id=1469272 4、effective go http://www.hellogcc.org/effective_go.html 5、深入go网络库 http://skoo.me/go/2014/04/21/go-net-core...阅读全文

博文 2017-12-21 16:00:00 cqvoip

[golang] 单例模式singleton,正确的打开方式

单例模式是常用的设计模式,但在golang里和c++/java等实现的方式略有不同,非常干净利落!来,上代码: import "sync" var once sync.Once var awsMeta *MetaDb func DefaultAWSMetaDb() *MetaDb { once.Do(func() { awsMeta, _ = NewMetaDb(AWS, TestConsulAddress) }) return awsMeta } int main() { meta1 := DefaultAWSMetaDb() meta2 := DefaultAWSMetaDb() meta3 := DefaultAWSMetaDb() // 上面的三个meta,使用同一个meta地址 }...阅读全文

博文 2019-08-02 01:02:43 liuzoxan