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

Golang的单引号、双引号与反引号的用法解析

Go语言的字符串类型string在本质上就与其他语言的字符串类型不同: Java的String、C++的std::string以及Python3的str类型都只是定宽字符序列 Go语言的字符串是一个用UTF-8编码的变宽字符序列,它的每一个字符都用一个或多个字节表示 即:一个Go语言字符串是一个任意字节的常量序列。 Golang的双引号和反引号都可用于表示一个常量字符串,不同在于: 双引号用来创建可解析的字符串字面量(支持转义,但不能用来引用多行) 反引号用来创建原生的字符串字面量,这些字符串可能由多行组成(不支持任何转义序列),原生的字符串字面量多用于书写多行消息、HTML以及正则表达式 而单引号则用于表示Golang的一个特殊类型:rune,类似其他语言的byte但又不完全一样,是指:码...阅读全文

博文 2019-03-22 05:34:39 Lateautumn_Lin

Snow——简单易用的Go语言业务框架

项目地址 中文文档 changelog Snow Snow是一套简单易用的Go语言业务框架,整体逻辑设计简洁,支持HTTP服务、队列调度和任务调度等常用业务场景模式。 Goals 我们致力于让PHPer更方便地切入到Go语言开发,在业务框架选择上贴合PHP主流框架的设计思想,以更低的学习成本快速熟悉框架,致力于业务逻辑的开发。 Features HTTP服务:基于gin进行模块化设计,简单易用、核心足够轻量;支持平滑重启; 任务调度:基于cron进行模块化设计,简单易用; 队列调度:基于自研的队列调度服务worker,通过Queue接口化,解耦队列调度与底层队列驱动;支持平滑关闭; Cache: 通用的接口化设计,框架实现了redis作为缓存底层驱动,支持可扩展; Database: 使用成...阅读全文

博文 2019-07-09 01:34:21 Wilee

Snow——简单易用的 Go 语言业务框架

## Snow Snow是一套简单易用的Go语言业务框架,整体逻辑设计简洁,支持HTTP服务、队列调度和任务调度等常用业务场景模式。 ## Goals 我们致力于让PHPer更方便地切入到Go语言开发,在业务框架选择上贴合PHP主流框架的设计思想,以更低的学习成本快速熟悉框架,致力于业务逻辑的开发。 ## Features - HTTP服务:基于[gin](https://github.com/gin-gonic/gin)进行模块化设计,简单易用、核心足够轻量;支持平滑重启; - 任务调度:基于[cron](https://github.com/robfig/cron)进行模块化设计,简单易用; - 队列调度:基于自研的队列调度服务[worker](https://github.com/qi...阅读全文

博文 2019-07-09 11:05:57 tinson

图解kubernetes容器探活机制核心实现状态管理

k8s为实现容器探活worker的管理构建了一个Manager组件,该组件负责底层探活worker的管理,并且缓存当前的容器的状态,并对外同步容器的当前状态,今天我们就来分析下其部分核心组件 1. 核心原理实现 Manager缓存的状态主要是会被kubelet、状态组件消费,并且在Pod同步状态的时候,会通过当前Manager里面的探测状态来更新Pod的容器的就绪与启动状态的更新,让我们一起看看Manager自身的一些关键实现吧 2. 探活结果管理 即prober/results/results_manager组件,其主要作用是:存储探测结果和通知探测结果 2.1 核心数据结构 cache负责容器的探测结果的保存,updates则负责对外更新状态的订阅,其通过新的结果和cache中的状态进行...阅读全文

博文 2020-02-12 12:34:18 8小时_2020

2.1 golang变量使用报错

package main import ( "fmt" ) func main() { var a = 1 } 会报错,因为变量定义了一定要用,golang内部规定的,可能是担心浪费内存吧 package main import ( "fmt" ) func main() { var a = 'a' fmt.Print(a) } 输入单个字符会自动转换成asc2的二进制码 ,结果是97 image.png package main import ( "fmt" ) func main() { var a = 'a' var b = 'bbbb' fmt.Print(a) } 单引号是单字符,如果在单引号放多字符会报错,如果需要放多字符,需要放双引...阅读全文

博文 2018-07-17 10:34:46 梁大路

Golang实现简单爬虫框架(3)——简单并发版

在上篇文章Golang实现简单爬虫框架(2)——单任务版爬虫中我们实现了一个简单的单任务版爬虫,对于单任务版爬虫,每次都要请求页面,然后解析数据,然后才能请求下一个页面。整个过程中,获取网页数据速度比较慢,那么我们就把获取数据模块做成并发执行。在项目的基础上,实现多任务并发版爬虫。 项目github地址:https://github.com/NovemberCh..., 回滚到相应记录食用,效果更佳。 1、项目架构 首先我们把但任务版爬虫架构中的Fetcher模块和Parser模块合并成一个Worker模块,然后并发执行Worker模块 然后得到并发版的架构图: 在并发版爬虫中,会同时执行多个Worker,每个Worker任务接受一个Request请求,然后请求页面解析数据,输出解析出的Re...阅读全文

博文 2019-05-22 11:34:41 jsfantasy

手摸手教你用go写爬虫之三(单任务版爬虫1.0)

> 本文介绍爬虫相关流程和搭建 ### 1. 项目需求 > 我们的需求分三步: 1. 从租房网站上获取到杭州市的所有区的链接和名称 2. 根据每个区的链接抓取第一页列表内容,找到房屋的链接和名称 3. 根据第2步中获取的链接,抓取对应的房屋的具体信息 ### 2. 项目流程 > step 1 从项目需求中可以分解出俩个信息 三步中均需要抓取 那么就要提供 url 三步中均需要解析 那么需要提供解析函数 func > 每一步解析到的结果我们需要暂存下来,如果含有链接需要继续抓取 这里我们抽象出两个结构体 ```go //请求结构体 type Request struct { Url string ParserFunc func(string) RequestResult } //结果解析结构体...阅读全文

博文 2019-02-20 20:13:19 wujiangwei

Golang简单的pipline

package main import ( "fmt" ) func main() { multiply := func(values []int, multiplier int) []int { multipliedValues := make([]int, len(values)) for i, v := range values { multipliedValues[i] = v * multiplier } return multipliedValues } add := func(values []int, additive int) []int { addedValues := make([]int, len(values)) for i, v := range values {...阅读全文

博文 2019-06-16 21:02:39 FredricZhu

【go源码分析】strings.go 里的那些骚操作

go version go1.11 darwin/amd64/src/strings/strings.go strings.go 文件中定义了近40个常用的字符串操作函数(公共函数)。以下是主要的几个函数。 函数 简介 Index(s, substr string) int 返回 substr 在 s 中第一次出现的位置,不存在返回 -1;采用RabinKarp算法 Split(s, sep string) []string 根据 sep 把字符串 s 进行切分,返回切分后的数组 Join(a []string, sep string) string 跟 Split 功能刚好相反 Repeat(s string, count int) string 返回字符串 s 重复 count 次得到的...阅读全文

详解SLB、EIP、NAT网关之间区别, 合理选择云上公网入口

摘要: 概述 阿里云的公网入口产品共有三个,SLB、EIP、NAT网关,这几个产品都可以作为云上资源的公网入口,他们之间有何区别,又分别应该在什么场景下使用呢? **点此查看原文:http://click.aliyun.com/m/41840/** **开始** 阿里云的公网入口产品共有三个,SLB、EIP、NAT网关,这几个产品都可以作为云上资源的公网入口,他们之间有何区别,又分别应该在什么场景下使用呢? 概念 -- **负载均衡SLB** **对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。** 可见云计算中的负载均衡除了通过流量分发让后端的服务器负载均衡,还有两个重...阅读全文

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

Golang websocket结合一致性哈希算法构建高并发推送服务

Golang websocket结合一致性哈希算法构建高并发推送服务 2018年9月2日 1 场景介绍 web应用中,常有业务状态需要实时更新的场景。如一个较长的后台任务,从浏览器用户触发执行到执行完成可能需几十秒的时间,这时前端需隔几秒请求一次后台,查询任务执行进度。此种方式是长轮询的方式,是存在一定弊端的,增加了后台服务的负载,若并发操作量太大,后台压力会成倍激增。业界常采用http1.1的websocket扩展协议与浏览器建立长连接来实现实时业务状态更新。 2 实现方案 本文采用golang实现一个长连接服务,对外提供两个接口,一个是基于http的rest消息发送接口,一个是基于websocket的cient接入接口,如下图所示。 为使前端的接入更简单,从建立连接到用户关闭浏览器,中间...阅读全文

博文 2019-06-21 11:48:46 Larry

Golang实现简单爬虫框架(2)——单任务版爬虫

Golang实现简单爬虫框架(2)——单任务版爬虫 上一篇博客Golang实现简单爬虫框架(1)——项目介绍与环境准备 )中我们介绍了go语言的开发环境搭建,以及爬虫项目介绍。 本次爬虫爬取的是珍爱网的用户信息数据,爬取步骤为: 1.进入珍爱网城市页面爬取所有的城市信息 2.进入城市详情页爬取用户URL地址信息 3.进入用户详情页爬取所需要的用户信息 注意:在本此爬虫项目中,只会实现一个简单的爬虫架构,包括单机版实现、简单并发版以及使用队列进行任务调度的并发版实现,以及数据存储和展示功能。不涉及模拟登录、动态IP等技术,如果你是GO语言新手想找练习项目或者对爬虫感兴趣的读者,请放心食用。 1、单任务版爬虫架构 首先我们实现一个单任务版的爬虫,且不考虑数据存储与展示模块,首先把基本功能实现。下...阅读全文

博文 2019-05-22 01:34:40 盐的甜

构建生产环境可用的高可用kubernetes集群

kubernetes集群三步安装 构建生产环境可用的高可用kubernetes集群 | sealos项目地址 特性 [x] 支持任意节点的etcd集群自动构建,且etcd集群使用安全证书,通过static pod方式启动,这样可以通过监控pod来监控etcd集群健康状态 [x] 支持多master节点,允许任意一台master宕机集群功能不受影响 [x] calico使用etcd集群,配置安全证书,网络管控数据无单点故障 [x] 包含dashboard, heapster coreDNS addons, coreDNS双副本,无单点故障 [x] 使用haproxy负载master节点,同样是用static pod,这样可通过统一监控pod状态来监控haproxy是否健康 [x] haprox...阅读全文

剖析nsq消息队列(一) 简介及去中心化实现原理

分布式消息队列nsq,简单易用,去中心化的设计使nsq更健壮,nsq充分利用了go语言的goroutine和channel来实现的消息处理,代码量也不大,读不了多久就没了。后期的文章我会把nsq的源码分析给大家看。 主要的分析路线如下 分析nsq的整体框架结构,分析如何做到的无中心化分布式拓扑结构,如何处理的单点故障。 分析nsq是如何保证消息的可靠性,如何保证消息的处理,对于消息的持久化是如何处理和扩展的。 分析nsq是如何做的消息的负载处理,即如何把合理的、不超过客户端消费能力的情况下,把消息分发到不同的客户端。 分析nsq提供的一些辅助组件。 这篇帖子,介绍nsq的主体结构,以及他是如何做到去中心化的分布式拓扑结构,如何处理的单点故障。 几个组件是需要先大概说一下 nsqd 消息队列的...阅读全文

博文 2019-08-30 15:52:43 li-peng

Golang实现简单爬虫框架(4)——队列实现并发任务调度

前言 在上一篇文章《Golang实现简单爬虫框架(3)——简单并发版》中我们实现了一个最简单并发爬虫,调度器为每一个Request创建一个goroutine,每个goroutine往Worker队列中分发任务,发完就结束。所有的Worker都在抢一个channel中的任务。但是这样做还是有些许不足之处,比如控制力弱:所有的Worker在抢同一个channel中的任务,我们没有办法控制给哪一个worker任务。 其实我们可以自己做一个任务分发的机制,我们来决定分发给哪一个Worker 注意:本次并发是在上一篇文章简单并发实现的基础上修改,所以没有贴出全部代码,只是贴出部分修改部分,要查看完整项目代码,可以查看上篇文章,或者从github下载项目源代码查看 1、项目架构 在上一篇文章实现简单并发...阅读全文

博文 2019-06-03 23:34:19 盐的甜

大数据工程师技能总结

业务分层划分 边缘部分 数据收集,高效、不丢、资源消耗低、可审计监控 数据传输,域名、链路选择 数据开发,部分数据开发需要下沉到边缘 中央部分 通用基础设施 机器选型,针对不同服务选择合适的机型 集群搭建,选择合适的发行版本 配置管理,做到自动化下发配置,管理集群,服务 监控管理,监控大数据平台组建,为调优、扩容提供数据支撑 数据平台基础 数据接入,选择Flume,易扩展,方便接入各类数据 数据计算,选择Spark,MR 数据存储,Kafka、HDFS、HBase、ClickHouse、ES、Mongodb 计算管理,yarn进行计算资源管理 任务调度,选择azkaban 数据分析,hiveSQL、sparkSQL 数据管理 数据开发,工具封装、任务调度、测试等 数据仓库,ODS、DW(视情...阅读全文

博文 2020-01-08 19:32:48 x4passer

Golang学习 - unicode/utf8 包

// 编码所需的基本数字 const ( RuneError = '\uFFFD' // 错误的 Rune 或 Unicode 代理字符 RuneSelf = 0x80 // ASCII 字符范围 MaxRune = '\U0010FFFF' // Unicode 码点的最大值 UTFMax = 4 // 一个字符编码的最大长度 ) // 将 r 转换为 UTF-8 编码写入 p 中(p 必须足够长,通常为 4 个字节) // 如果 r 是无效的 Unicode 字符,则写入 RuneError // 返回写入的字节数 func EncodeRune(p []byte, r rune) int // 解码 p 中的第一个字符,返回解码后的字符和 p 中被解码的字节数 // 如果 p 为空,则...阅读全文

博文 2019-04-19 18:34:40 佛心看世界

Golang面试之Shell

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。 Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。 引用 Shell 教程 Shell 变量 定义变量 定义变量变量名不加美元符号,如: your_name="runoob.com" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则: 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头; 中间不能有空格,可以使用下划线...阅读全文

博文 2020-05-12 01:32:52 网管同学

深入理解Go-垃圾回收机制

Go的GC自打出生的时候就开始被人诟病,但是在引入v1.5的三色标记和v1.8的混合写屏障后,正常的GC已经缩短到10us左右,已经变得非常优秀,了不起了,我们接下来探索一下Go的GC的原理吧 三色标记原理 我们首先看一张图,大概就会对 三色标记法 有一个大致的了解: 原理: 首先把所有的对象都放到白色的集合中 从根节点开始遍历对象,遍历到的白色对象从白色集合中放到灰色集合中 遍历灰色集合中的对象,把灰色对象引用的白色集合的对象放入到灰色集合中,同时把遍历过的灰色集合中的对象放到黑色的集合中 循环步骤3,知道灰色集合中没有对象 步骤4结束后,白色集合中的对象就是不可达对象,也就是垃圾,进行回收 写屏障 Go在进行三色标记的时候并没有STW,也就是说,此时的对象还是可以进行修改 那么我们考虑一...阅读全文

博文 2019-08-15 21:02:38 tyloafer

Golang搭建并行版爬虫信息采集框架!

1.简介Go语言在分布式系统领域有着更高的开发效率,提供了海量并行的支持。本博文介绍的是采用Go语言搭建一个并行版爬虫信息采集框架,博文中使用58同城中租房网页做案例。相比较其他爬虫程序它的优点是:1.抓取信息速度非常快,因为是并行处理的,通过配置协程数量,可以比普通的爬虫信息采集程序快上上百倍。2.功能模块化,每个功能模块各司其职,配置简单。通过修改信息抓取规则,就可以采集不同网站中的数据。程序源代码放到github上,链接地址是: https://github.com/GuoZhaoran/crawler2.项目架构下面是项目整体架构的示意图:2.1 Request(请求)该爬虫架构中Request请求可以理解为:抓取请求url的内容,例如抓取58同城北京市的租房信息时,请求的url是:...阅读全文

博文 2018-12-27 14:34:44 919b0c54458f

3. Go语言中的整型与浮点型

文章首发自公众号:Go编程时光 《Go编程时光》,一个能带你学习 Go 语言的专栏,同时欢迎搜索我的同名公众号【Go编程时光】(排版精美更适合阅读),第一时间获取Go语言干货。 系列导读 1. 一文搞定Go语言开发环境的搭建 2. Go 语言中五种变量创建的方法 1. 整型 Go 语言中,整数类型可以再细分成10个类型,为了方便大家学习,我将这些类型整理成一张表格。 int 和 uint 的区别就在于一个 u,有 u 说明是无符号,没有 u 代表有符号。 解释这个符号的区别 以 int8 和 uint8 举例,8 代表 8个bit,能表示的数值个数有 2^8 = 256。 uint8 是无符号,能表示的都是正数,0-255,刚好256个数。 int8 是有符号,既可以正数,也可以负数,那怎么...阅读全文

博文 2020-03-27 14:34:36 王一白

Golang strconv包使用

// atob.go ------------------------------------------------------------ // ParseBool 将字符串转换为布尔值 // 它接受真值:1, t, T, TRUE, true, True // 它接受假值:0, f, F, FALSE, false, False. // 其它任何值都返回一个错误 func ParseBool(str string) (value bool, err error) func main() { fmt.Println(strconv.ParseBool("1")) // true fmt.Println(strconv.ParseBool("t")) // true fmt.Println...阅读全文

博文 2019-01-28 15:34:50 小马哥_Magical

Go语言开发分布式任务调度 轻松搞定高性能Crontab

第1章 课程介绍本章中将介绍一下本课程的基本内容,包括:我们要做什么、要求什么基础、将学会哪些工具、收获哪些独家干货,以及课程具体安排。1-1 课程导学试看第2章 如何执行shell命令执行"定时任务"其实就是执行"shell命令"。在本章中,将首先带大家区分"程序"与"命令",接着了解bash命令解释器的2种工作模式,并图示分析shell执行任务的底层原理与涉及的系统调用。最后,我们使会用Go语言的Command标准库,实现任务的执行,输出捕获,杀死任务等重要功能。 ...2-1 原理介绍2-2 执行任务2-3 捕获任务输出2-4 强制结束任务第3章 如何解析cron表达式cron表达式是配置定时任务执行周期的核心工具。在本章中,将首先分析cron表达式的构成以及解析逻辑,并利用开源项目c...阅读全文

博文 2019-03-28 13:34:40 itsource论坛

撮合引擎开发:解密黑箱流程

撮合引擎开发:开篇 撮合引擎开发:MVP版本 撮合引擎开发:数据结构设计 撮合引擎开发:对接黑箱 撮合引擎开发:解密黑箱流程 业务流程 前面的几篇文章已经陆续讲到了黑箱内部的一些设计,包括核心的软件结构、数据结构、目录结构等。而从本小节开始,我们将会更加深入,来解密黑箱内部的更多设计和实现细节。 解密黑箱的第一步就是要清楚其内部对数据的处理流程是怎样的。当我们要设计一个新系统的时候,也是一样的,第一步要梳理清楚业务流程和数据流向。对撮合引擎来说,就是要了解:从输入到输出,中间都经过了哪些处理流程。 前面的文章已经讲过,本撮合引擎定义了三种输入:开启撮合、处理订单、关闭撮合。后面就分别来看看这三种输入背后的流程。 开启撮合 开启撮合即是开启某个交易标的(交易对)的撮合引擎,未开启撮合的交易标的...阅读全文

博文 2019-11-28 12:34:13 Keegan小钢

Go语言中其他数据与字符串类型的转换

1 概述 Go语言是强类型语言,因此总会需要将字符串转成需要的类型。比如整型和字符串转换,字符串和布尔型的转换等。本文就介绍如何完成这些转换,以下是Go语言关于字符串转换的整理说明,主要是与切片类型的转换,和 strconv 包的使用。 2 与切片的转换 切片类型可以和字符串类型相互转换。 fmt.Println([]rune("Hello小韩说课")) // [72 101 108 108 111 23567 38889 35828 35838] fmt.Println(string([]rune{72, 101, 108, 108, 111, 23567, 38889, 35828, 35838})) // Hello小韩说课 fmt.Println([]byte("Hello")) /...阅读全文

博文 2018-10-28 07:35:09 小韩说课

爬虫性能分析及优化

前两天我们写了单任务版爬虫爬取了珍爱网用户信息,那么它的性能如何呢? 我们可以通过网络利用率看一下,我们用任务管理器中的性能分析窗口可以看到下载速率大概是保持在了200kbps左右,这可以说是相当慢了。 我们针对来通过分析单任务版爬虫的设计来看下: 从上图我们可以看出,engine将request从任务队列取出来,送到Fetcher取获取资源,等待数据返回,然后将返回的数据送到Parser去解析,等待其返回,把返回的request再加到任务队列里,同时把item打印出来。 慢就慢在了没有充分利用网络资源,其实我们可以同时发送多个Fetcher和Pareser,等待其返回的同时,可以去做其他的处理。这一点利用go的并发语法糖很容易实现。 上图中,Worker是Fetcher和Parser的合并...阅读全文

golang-nsq系列(一)--初识

nsq 最初是由 bitly 公司开源出来的一款简单易用的分布式消息中间件,它可用于大规模系统中的实时消息服务,并且每天能够处理数亿级别的消息。 它具有以下特性: 分布式。它提供了分布式的、去中心化且没有单点故障的拓扑结构,稳定的消息传输发布保障,能够具有高容错和高可用特性。 易于扩展。它支持水平扩展,没有中心化的消息代理(Broker),内置的发现服务让集群中增加节点非常容易。 运维方便。它非常容易配置和部署,灵活性高。 高度集成。现在已经有官方的Golang、Python和JavaScript客户端,社区也有了其他各个语言的客户端库方便接入,自定义客户端也非常容易。 1. 首先到官方文档看用法: https://nsq.io/overview/quick... 下载对应的二进制可执行文件...阅读全文

博文 2019-08-18 21:02:38 热爱coding的稻草

Go语言中其他数据与字符串类型的转换

## 1 概述 Go语言是强类型语言,因此总会需要将字符串转成需要的类型。比如整型和字符串转换,字符串和布尔型的转换等。本文就介绍如何完成这些转换,以下是Go语言关于字符串转换的整理说明,主要是与切片类型的转换,和 strconv 包的使用。 ## 2 与切片的转换 切片类型可以和字符串类型相互转换。 ``` fmt.Println([]rune("Hello小韩说课")) // [72 101 108 108 111 23567 38889 35828 35838] fmt.Println(string([]rune{72, 101, 108, 108, 111, 23567, 38889, 35828, 35838})) // Hello小韩说课 fmt.Println([]byte("...阅读全文

博文 2018-10-30 22:28:30 hanzkering

Go语言单链表

package main import "fmt" type Node struct { data int next *Node } func Shownode(p *Node){ //遍历 for p != nil{ fmt.Println(*p) p=p.next //移动指针 } } func main() { var head = new(Node) head.data = 0 var tail *Node tail = head //tail用于记录最末尾的结点的地址,刚开始tail的的指针指向头结点 for i :=1 ;i<10;i++{ var node = Node{data:i} (*tail).next = &node tail = &node } Shownode(h...阅读全文

博文 2019-12-25 19:33:14 huang_he_87

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

软件结构很重要!嵌入式C语言修炼之道

模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求。C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行划分在面向对象设计中成为一个错误,牛顿定律遇到了>相对论),C语言模块化程序设计需理解如下概念:(1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明;(2) 某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明;(3) 模块内的函数和全局变量需在.c文件开头冠以static关键字声明;(4) 永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外...阅读全文

博文 2019-01-17 17:14:57 wangzijuan

go学习笔记-goroutine的好兄弟channel

上一篇介绍了atomic包以及互斥锁 mutex来解决并发竞争状态的问题。这一篇主要来介绍go中与goroutine经常搭档的好兄弟channel channel不仅可以可以来用消除竞争状态,还可以用于不同的goroutine中进行通信,发送与接受数据。chaanel的定义有两种,分为有缓存与无缓冲 创建channel chan1 := make(chan int) // 创建一个无缓冲的 整形 channel chan2 := make(chan int,2)// 创建一个有缓冲的 整形 channel 上面的代码片段,我们分别创建了一个无缓冲的channel与一个有缓冲的channel。channel的创建是使用make(chan type,[lenght])来创建,如果指定了第二个参数...阅读全文

博文 2020-01-11 13:32:40 旧梦发癫

Snow——简单易用的Go语言业务框架

项目地址 中文文档 changelog Snow Snow是一套简单易用的Go语言业务框架,整体逻辑设计简洁,支持HTTP服务、队列调度和任务调度等常用业务场景模式。 Goals 我们致力于让PHPer更方便地切入到Go语言开发,在业务框架选择上贴合PHP主流框架的设计思想,以更低的学习成本快速熟悉框架,致力于业务逻辑的开发。 Features HTTP服务:基于gin进行模块化设计,简单易用、核心足够轻量;支持平滑重启; 任务调度:基于cron进行模块化设计,简单易用; 队列调度:基于自研的队列调度服务worker,通过Queue接口化,解耦队列调度与底层队列驱动;支持平滑关闭; Cache: 通用的接口化设计,框架实现了redis作为缓存底层驱动,支持可扩展; Database: 使用成...阅读全文

博文 2019-07-08 20:02:38 wilee

golang-nsq系列(一)--初识

nsq 最初是由 bitly 公司开源出来的一款简单易用的分布式消息中间件,它可用于大规模系统中的实时消息服务,并且每天能够处理数亿级别的消息。 nsq 它具有以下特性: 分布式。它提供了分布式的、去中心化且没有单点故障的拓扑结构,稳定的消息传输发布保障,能够具有高容错和高可用特性。 易于扩展。它支持水平扩展,没有中心化的消息代理(Broker),内置的发现服务让集群中增加节点非常容易。 运维方便。它非常容易配置和部署,灵活性高。 高度集成。现在已经有官方的Golang、Python和JavaScript客户端,社区也有了其他各个语言的客户端库方便接入,自定义客户端也非常容易。 1. 首先到官方文档看用法: https://nsq.io/overview/quick_start.html q...阅读全文

博文 2019-08-19 02:32:44 热爱coding的稻草

图解kubernetes服务打散算法的实现源码

在分布式调度中为了保证服务的高可用和容灾需求,通常都会讲服务在多个区域、机架、节点上平均分布,从而避免单点故障引起的服务不可用,在k8s中自然也实现了该算法即SelectorSpread, 本文就来学习下这个算法的底层实现细节 1. 设计要点 1.1 zone与node zone即代表一个区域,node则是一个具体的节点,而该打散算法的目标就是将pod在zone和node之间进行打散操作 1.2 namespace namespace是k8s中进行资源隔离的实现,同样的筛选也是如此,在筛选的过程中,不同namespace下面的pod并不会相互影响 1.3 计数与聚合 SelectorSpread算法是scheduler中优先级算法的一种,其实现了优先级算法的map/reduce方法,其中ma...阅读全文

leetcode_621

Golang: 思路:任务调度,这里用了个很麻烦的实现,所以效率上来说不太高,思路可以这么想,如何将一个有长板和短板的木桶以最快的速度归0。 代码如下: func mergeTrees(t1 *TreeNode, t2 *TreeNode) *TreeNode { if t1==nil&&t2!=nil{ return t2 }else if t1!=nil&&t2==nil{ return t1 }else if t1==nil&&t2==nil{ return nil }else{ return &TreeNode{ Val:t1.Val+t2.Val, Left:mergeTrees(t1.Left,t2.Left), Right:mergeTrees(t1.Right,t2.Righ...阅读全文

博文 2020-04-01 09:33:05 淳属虚构

消息队列 NSQ 源码学习笔记 (四)

> **nsq** 工具集学习 ### nsq\_to\_nsq nsq 作为消息队列,有个优势是nsqd 各节点之间是不关联的,如果一个节点出了问题,仅仅影响该节点下的topic,channel,以及相关的生产者、消费者。 也就是官方说明的特性第一条:**no SPOF** ( single point of failure 单点故障)。好处不言而喻,坏处也是有的,如果节点出问题,没有备份数据无法恢复。 所以,在官方提供了 nsq\_to\_nsq 作为 nsqd 节点复制的工具,用于做 nsqd 节点数据的备份, 或者也可以用于数据的分发。 类似于MirrorMaker. #### 特性: - 支持将M 个 topic 的消息 publish 到 N 个 nsqd...阅读全文

DjanFey的基础库解读--bufio包(bufio.go)

package my_bufio import ( "bytes" "errors" "io" "unicode/utf8" ) const ( defaultBufSize = 4096 ) var ( // 非法使用UnreadByte ErrInvalidUnreadByte=errors.New("bufio: invalid use of UnreadByte") // 非法使用UnreadRune ErrInvalidUnreadRune = errors.New("bufio: invalid use of UnreadRune") // buffer已满 ErrBufferFull = errors.New("bufio: buffer full") // count为负 E...阅读全文

博文 2020-03-14 23:41:34 DjanFy

图解kubernetes批处理Job控制器的关键设计

K8s中的批处理任务模块主要是由Job控制器完成,今天我们就来关注下其底层的关键设计,包括完成状态、并行模式、并行策略等关键机制 1. 基础概念 在聊k8s的任务模块的实现的时候,我们先看一下传统的任务系统的设计与实现,然后聊下基于k8s的基础的概念 1.1 传统的任务系统设计 传统的任务系统设计主要可以分为master(任务分配/故障感知/负载均衡)、Worker(任务执行/任务监控/任务管理)、分布式协调(etcd等存储元数据)、任务仓库(存储任务的实现比如类或者接口)等几部分, 从大的部分又可以切分为两个部分管控端(分布式协调/master/仓库)、执行端(Worker),传统的任务系统大概就是这样 通常复杂的就是如何在master如何做任务的负载均衡、任务的快速完成、依赖等管控功能,...阅读全文