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

#1 helloworld.go

写在前面 这不是一篇教程。 是的,准确的来说,这是一份golang学习过程的记录 记录着从golang的基础语法开始到最后也许可以用golang作出点有趣的东西的过程 笔者打算以「程序代码」+「提问解释」这种简洁的记录方式来分享各阶段的学习 当然,第一次学习对于某些内容理解可能有所偏颇,容日后再修正 如果你也是对golang这门语言感兴趣的人 一起呀 安装golang mac安装go �windows安装go(参考前半部分即可) linux安装go 第一个go程序 //helloworld.go package main import "fmt" func main() { fmt.Println("Hello,World") } 如何运行? 在helloworld.go文件所在目录,输入:...阅读全文

博文 2019-10-29 10:32:48 aside section._1OhGeD

《Go语言程序设计》 读书笔记 (八) 包

Go语言有超过100个的标准包(可以用go list std | wc -l命令查看标准包的具体数目),标准库为大多数的程序提供了必要的基础构件。在Go的社区,有很多成熟的包被设计、共享、重用和改进,目前互联网上已经发布了非常多的Go语言开源包,它们可以通过 http://godoc.org 检索。在本章,我们将演示如果使用已有的包和创建新的包。 包简介 任何包系统设计的目的都是为了简化大型程序的设计和维护工作,通过将一组相关的特性放进一个独立的单元以便于理解和更新,在每个单元更新的同时保持和程序中其它单元的相对独立性。这种模块化的特性允许每个包可以被其它的不同项目共享和重用,在项目范围内、甚至全球范围统一地分发和复用。 每个包一般都定义了一个不同的命名空间用于它内部的每个标识符的访问。每个...阅读全文

博文 2020-01-13 13:32:41 Kevin

(转)golang中context包解读

源码剖析 context.Context 接口 context包的核心 // context 包里的方法是线程安全的,可以被多个 goroutine使用 type Context interface { // 如果存在,Dealline 返回Context将要关闭的时间 Deadline() (deadline time.Time, ok bool) // 当Context 被 canceled 或是 times out 的时候,Done 返回一个被 closed 的Channel Done() <-chan struct{} // 在 Done 的 channel被closed后, Err 代表被关闭的原因 Err() error // 如果存在,Value 返回与 key 相关了的值, ...阅读全文

博文 2019-02-22 22:34:42 one_zheng

10.Go语言基础之包

在工程化的GO语言开发项目中,GO语言的源码复用是建立在包(pakage)基础之上的。 不仅GO语言中有包的概念,别的语言中也是有包的概念的。 1.Go语言的包(package) 1.1包介绍 包(package)是多个Go源码的集合,是一种高级的代码复用方案,Go语言为我们提供了很多内置包,如fmt,os,io等。 1.2定义包 我们可以根据自己的需要创建自己的包。 一个包可以简单理解为一个存放.go文件的文件夹。该文件夹下面的所有go文件都要在代码的第一行添加如下代码,声明改文件归属的包。 package 包名 注意事项: 1.一个文件夹下面直接包含的文件只能归属一个package,同样一个package的文件不能再多个文件夹下。 2.包名可以不和文件夹的名字一样,包名不能包含-符号。 ...阅读全文

博文 2020-02-04 23:33:10 DevOperater

图解kubernetes中的api多版本中反序列化与转换

在之前的文章中分析过kubernetes是如何进行多版本管理中提到了一个关键的设计解码器, 负责将请求对象反序列化成一个具体的数据模型,今天一起来了解下其内部是如何实现多版本管理、转换的设计要点 1.版本化管理的关键设计 1.1 从拓扑转换到星状转换 在通常的web开发中更多的时候,大家都是断代向前兼容更新,大多数情况下当版本更新之后会独立演进,如果要在多版本之间转换通常则会出现如下的情况如果我们要为每个版本都去适配其他所有的版本,则复杂度会指数级上升,而在kubernetes中则通过一个内部版本的设计来进行解决,内部版本是一个稳定的版本,所有的版本都只针对目标版本来进行转换的实现,而不关注其他版本 1.2 兼容设计之转换 那如果谋个版本需要独立的演进,或者增设一些新的字段,修改字段名称等破...阅读全文

博文 2020-03-03 14:32:45 仔仔

【源码阅读】Nsqd

Nsqd源码阅读 简介 nsqd为nsq daemon的简写,是nsq组件最主要的服务。nsqd提供一个tcp服务、一个http服务以及一个可选的https服务,tcp服务于客户端(生产者或消费者),http则提供API(可用于创建、删除topic与channel,生产数据,清空数据等)。 初始化 nsqd的启动入口为apps/nsqd/nsqd.go文件里的main函数。首先定义了一个program的结构体,用于对程序的控制。结构体内元素为指向NSQD的指针。main函数里面定义了一个具体的prg,然后Run它。Run函数负责启动prg并阻塞,直至接收到对应的信号(对于nsqd为SIGINT或者SIGTERM信号)。 type program struct { nsqd *nsqd.NSQ...阅读全文

博文 2020-01-31 22:32:38 moonbamboo

golang sync.Once

package main // once 只执行一次,底层实现:应用互斥锁机制 import ( "sync" "fmt" ) var once sync.Once // 返回一个结构体指针类型 func fun1(endNum int) { res := 0 for i :=0; i <= endNum; i++ { res += i } fmt.Println("res:", res) } func main() { endNum := 100 // Do 函数接受一个无参数函数作为输入 once.Do(func(){ fun1(endNum) }) ...阅读全文

博文 2020-04-17 23:32:46 小麦客

Golang笔记-基准测试

上一篇写了些简单的单元测试,这一篇来看看go中的基准测试。在go中基准测试也是开箱即用的。使用testing.B结构对象。 需要测试的代码 我们依然用上一篇的代码结构 │ main.go │ main_test.go main.go func JoinStrUseSprint(a,b string) string { return fmt.Sprintf("%s%s",a,b) } func JoinStrUseNor(a,b string) string { return a+b } 创建一个基准测试 创建普通单元测试我们使用TestFunc来定义。创建基准测试我们需要使用BenchmarkFunc来定义。 func TestJoinStrUseNor(t *testing.T) { s ...阅读全文

博文 2020-05-21 22:32:42 旧梦发癫

Golang——切片slice

切片是一个拥有相同类型元素的可变长度的序列,底层基于数组类型进行封装。 切片是一个引用类型,内部结构包括地址(切片中第一元素的指向的内存空间)、大小(切片中目前元素的个数)和容量(底层数组最大能存放的元素个数),必须初始化才能使用。 值类型,整型、浮点型、布尔型、字符串、数组,声明时就有初始值。 引用类型,声明时候的初始值是nil。nil在内存中是没有位置。 var 变量名 []变量类型 切片使用 func main() { // 直接声明使用 var a = []int{1, 2, 3} fmt.Println(a) //[1 2 3] fmt.Println(a[1]) //2 fmt.Printf("a:%T\n", a) //a:[]int //从数组中得到切片 var b = [1...阅读全文

博文 2020-05-21 23:32:46 Cici冬雪

利用golang优雅的实现单实例

平时编写代码过程中,经常会遇到对于全局角度只需运行一次的代码,比如全局初始化操作,设计模式中的单例模式。针对单例模式,java中又出现了饿汉模式、懒汉模式,再配合synchronized同步关键字来实现。其目的无非就是将对象只初始化一次,而且最好保证在用到的时候再进行初始化,以避免初始化太早浪费资源,或者两次初始化破坏单例模式的实例唯一性。 Go语言的sync包中提供了一个Once类型来保证全局的唯一性操作,其通过Do(f func())方法来实现,即使 f 函数发生变化,其也不会被执行,下面我们来看一个小例子: package main import ( "fmt" "sync" "time" ) var once sync.Once func main() { //once循环调用fir...阅读全文

博文 2019-10-18 10:02:42 小碗汤

Tank技术【3-6】GoLang语法实战学习(4)

九、结构体 Go语言的结构体和C语言是类似的。定义结构体如下: type books struct { sName string sAuthor string nID int64 fPrice float64 sOwner string } 使用结构体有两种办法: var myBook books myBook.sName ="Go语言实战" myBook.sAuther = "Tank" myBook.nID =139581 myBook.fPrice = 58.88 myBook.sOwner ="Tank" theBook :=books{"Go语言实战", "Tank", 139581, 58.88, "Dennis"} yourBook := books{sName:"Go语言实战...阅读全文

博文 2020-01-06 19:32:43 idontknowctt

defer 链如何被遍历

去年开始写文章的第一篇就是关于 defer,名字比较文艺:《Golang 之轻松化解 defer 的温柔陷阱》,还被吐槽了。因为这篇文章,到《Go 夜读》讲了一期。不过当时纯粹是应用层面的,也还没有跳进 Go 源码这个大坑,文章看着比较清新,也没有大段的源码解析。 自从听了曹大在《Go 夜读》分享的 Go 汇编,以及研读了阿波张的 Go 调度器源码分析的文章后,各种源码、汇编满天飞…… 上次欧神写了一篇《Go GC 20 问》,全文也没有一行源码,整体读下来很畅快。今天这篇也来尝试一下这种写法,不过,我们先从一个小的主题开始:defer 链表是如何被遍历并执行的。 关于 defer 的源码分析文章,网络上也有很多。不过,很少有能完全说明白这个话题的,除了阿波张的。 我们知道,为了在退出函数前...阅读全文

博文 2020-03-23 21:46:11 qcrao-2018

13. Go 语言异常机制:panic 和 recover

Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:http://golang.iswbm.com我的 Github:github.com/iswbm/GolangCodingTime 编程语言一般都会有异常捕获机制,在 Python 中 是使用raise 和 try-except 语句来实现的异常抛出和异常捕获的。 在 Golang 中,有不少常规错误,在编译阶段就能提前告警,比如语法错误或类型错误等,但是有些错误仅能在程序运行后才能发生,比如数组访问越界、空指...阅读全文

博文 2020-05-08 08:32:41 Python编程时光

2019-11-25

初探之 sync.Once # 描述 sync.Once 是 Golang package 中使方法只执行一次的对象实现,作用与** init **函数类似。但也有所不同。 init 函数是在文件包首次被加载的时候执行,且只执行一次 sync.Onc 是在代码运行中需要的时候执行,且只执行一次 当一个函数不希望程序在一开始的时候就被执行的时候,我们可以使用 sync.Once。 例如: package main import ( "fmt" "sync" ) func main() { var once sync.Once onceBody := func() { fmt.Println("Only once") } done := make(chan bool) for i := 0; i...阅读全文

Go Web 编程之 模板(二)

概述 在上一篇文章中,我们介绍了 Go 模板库text/template。 text/template库用于生成文本输出。在 Web 开发中,涉及到很多安全方面的问题。有些数据是用户输入的,不能直接替换到模板中,否则可能导致注入攻击。 Go 提供了html/template库处理这些问题。html/template提供了与text/template一样的接口。 我们通常使用html/template生成 HTML 输出。 由于上一篇文章已经详细介绍了 Go 模板的基本概念, 本文主要从使用的层面来介绍html/template库。中间会有安全方面的内容。那就开始吧! 初体验 html/template库的使用与text/template基本一样: package main import ( ...阅读全文

博文 2020-01-10 15:34:19 darjun

reflect反射的实际中的应用及畅想

文地址[https://mojotv.cn/go/golang-reflect-string] 1. ???? 解决了什么 我有很多行日志数据单行的格式是这样的 HOST;000012000629948340196501;ipv4;3; ips: user_id=2;user_name=172.21.1.102;policy_id=1;src_mac=52:54:00:62:7f:4a;dst_mac=58:69:6c:7b:fa:e7;src_ip=172.21.1.102;dst_ip=172.22.2.3;src_port=48612;dst_port=80;app_name=网页浏览(HTTP);protocol=TCP;app_protocol=HTTP;event_id=1310...阅读全文

通过例子学习 Go 和 Rust ---- IO Reader

IO操作是咱编程时经常会遇到的,两种语言都提供了通用的Read方法,可以让咱从reader结构体里面读出数据。 Go //io/io.go type Reader interface { Read(p []byte) (n int, err error) } //bytes/reader.go type Reader struct { s []byte i int64 // current reading index prevRune int // index of previous rune; or < 0 } // Read implements the io.Reader interface. func (r *Reader) Read(b []byte) (n int, err er...阅读全文

博文 2020-03-05 12:32:42 Tericoder

(一)Golang概述(2)-简单实例

1.简单开发 1.1 需求 要求开发一个 hello.go 程序,可以输出 "hello,world” 1.2 代码 image-20200508142914375.png go文件的后缀是 .go package main ​ 表示该 hello.go 文件所在的包是 main, 在 go 中,每个文件都必须归属于一个包。 import “fmt” ​ 表示:引入一个包,包名 fmt, 引入该包后,就可以使用 fmt 包的函数,比如:fmt.Println (4) func main() {} ​ func 是一个关键字,表示一个函数。 ​ main 是函数名,是一个主函数,即我们程序的入口。 fmt.Println(“hello”) ​ 表示调用 fmt 包的函数 Println 输出 ...阅读全文

博文 2020-05-08 23:32:56 21号新秀_邓肯

Golang中defer、return、返回值之间执行顺序的坑

载自:https://studygolang.com/articles/4809 Go语言中延迟函数defer充当着 cry...catch 的重任,使用起来也非常简便,然而在实际应用中,很多gopher并没有真正搞明白defer、return和返回值之间的执行顺序,从而掉进坑中,今天我们就来揭开它的神秘面纱! 先来运行下面两段代码: A. 无名返回值的情况 package main import ( "fmt" ) func main() { fmt.Println("return:", a()) // 打印结果为 return: 0 } func a() int { var i int defer func() { i++ fmt.Println("defer2:", i) // 打印结...阅读全文

博文 2020-05-19 15:32:47 大菜狗RookieDog

Golang和Erlang的并发调度浅析

Go 语言和 Erlang 都是面向并发应用的语言,都采用轻量级线程和消息传递模型。尽管Go在语法上也支持共享,但必须以通信的方式同步方能保证其正确性。Erlang则是完全不支持进程间的共享,状态信息完全需要依靠消息彼此传递。从底层来看,在 Google 官方编译器中,Go 语言的 Goroutine 是一种类似协程的结构,由于采用了定制的C编译器来构建,因此其上下文切换的效率要高于C库的 coroutine(只需要切换PC和栈帧,其他寄存器由函数调用者负责保存); 而在 Go 的 GCC 前端中,Goroutine 则直接由C库的 coroutine 机制实现。由于 Erlang 是基于 BEAM 虚拟机执行的,因此它的所谓 “轻量进程” 也就仅仅是 BEAM 上的概念,不对应C语言或OS...阅读全文

博文 2019-03-17 13:09:33 erlib

Golang和Erlang的IO调度浅析

之前关于调度器的对比分析的文章,在结束时遗留了一些问题:当系统出现高并发的IO访问时,如一个网络服务器通常要并发处理成百上千的链接,每个链接可能都是由一个用户任务执行的,那么将会出现大量阻塞的IO操作,如果为每个阻塞操作都单独分配一个OS线程,那么系统很容易就会退化成多OS线程的系统,轻量任务的优势将无从谈起。本文试图回答这个问题,通过分析Go和Erlang对于IO、特别是网络IO的优化机制,了解其对调度器乃至整个系统性能的影响。Go的IO优化机制 —— netpoller由于Go是一门主要面向互联网环境的分布式语言,相对于一般的IO,如文件读写等,网络IO的并发性能更加重要。对于一般IO,Go的处理方式就是按上篇所说的,将执行Syscall的OS线程剥离。通常应用场景下,不会出现大量并发G...阅读全文

博文 2019-03-17 13:10:21 erlib

golang的反射与实践(下)

上篇说了下反射该怎么用,现在我们来看一看使用反射的实际情况,深入理解一下 这篇因为是实践篇,所以有大量的代码示例来进行演示,因为只是演示反射的使用,所以对一些复杂的错误机制没做处理 反射本身并不难,看懂了上一章反射到底是干嘛用的,什么时候用,这一章其实非常好懂 说到底就是将reflect包提供给我们的方法,进行一些组合使用罢了,说土一点就是调用下API 没看上篇的可以先看看golang的反射与实践(上) 反射的实践操作 好了,咱们开始进行实践 先把我们的准备工作做好,先定义一个Struct,再给这个结构体加上一些方法 // Employee 员工 type Employee struct { Name string `json:"emp_name"` Age int `json:"emp_a...阅读全文

博文 2019-06-13 11:02:50 闹闹吃鱼

让我们一起啃算法----搜索插入位置

搜索插入位置( Search-Insert-Position ) 题干: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1: 输入: [1,3,5,6], 5 输入: 输出: 2示例 3: 输入: 输入: [1,3,5,6], 7 输入: 输出: 4示例 4: 输入: 输入: [1,3,5,6], 0 输入: 输出: 0来源:力扣 这题主要应用 二分查找 的思路来解题,题目是比较简单的,但是 二分查找 这个思路还是蛮重要的。 解题思路 一般使用 二分查找 都需要先对原数组进行排序,题中给到的数组是已经排序的,因此这一步可以省去。 二分查找 思路比较简单,首先初始化三个指针: left ...阅读全文

博文 2020-05-20 17:33:02 三斤和他的朋友们

第五章 函数

函数就是一个单独的代码块,可以从其他的地方多次调用。在golang中函数可以作为一个类型声明某一变量。同时在golang中的函数时可以返回多个值的。声明和函数基本定义这里不做赘述 log包提供很多错误日志记录,不过一般log会输出错误之前输出时间信息,所以当不希望看到这些时间信息的时候可以使用log.SetPrefix()和log.SetFlags(0)来屏蔽时间前缀。直接当然log包的Fprintf函数也可以直接输出错误信息。 读取文件时,常常因为读取长度与文件结尾不能同步,导致各种错误,在go的io包中定义了io.EOF错误,标识文件结束。 匿名函数 拥有函数名的函数只能在包级语法块中被声明,通过函数字面量,可以绕开这一限制,在任何表达式中表示一个函数值。函数字面量的语法和函数声明相似,...阅读全文

博文 2018-11-20 17:34:45 zhaoxi_yu

11. 数组和切片

11. 数组和切片 数组 数组是同一类型元素的集合。例如,整数集合 5,8,9,79,76 形成一个数组。Go 语言中不允许混合不同类型的元素,例如包含字符串和整数的数组。(译者注:当然,如果是 interface{} 类型数组,可以包含任意类型) 数组的声明 一个数组的表示形式为 [n]T。n 表示数组中元素的数量,T 代表每个元素的类型。元素的数量 n 也是该类型的一部分(稍后我们将详细讨论这一点)。 可以使用不同的方式来声明数组,让我们一个一个的来看。 package main import ( "fmt" ) func main() { var a [3]int //int array with length 3 fmt.Println(a) } var a[3]int 声明了一个长...阅读全文

博文 2019-08-29 11:32:55 泷汰泱

实现Raft协议:Part 2 - 指令和日志复制

翻译自Eli Bendersky的系列博客,已获得原作者授权。 本文是系列文章中的第一部分,本系列文章旨在介绍Raft分布式一致性协议及其Go语言实现。文章的完整列表如下: 序言:介绍 第一部分:选主 第二部分:指令和日志复制(本文) 第三部分:持久性和优化 在这一部分,我们会大幅强化Raft的实现,做到能够实际处理客户端提交的指令,并在Raft集群中复制它们。代码结构与第一部分相同,会有一些新的结构体和函数定义,对旧代码也会有一些改动——我会对这些做简短的解释。 本部分的所有代码都在这个目录。 客户端交互 我们在序言中对客户端交互进行了简短的讨论,我强烈建议您返回去重新读一下对应章节。接下来,我们不会关注客户端如何找到领导者,相反,我们讨论的是当他已经找到领导者时,会发生什么。 首先说明一...阅读全文

博文 2020-05-06 14:36:13 GuoYaxiang

详解Go语言的计时器

Go语言的标准库里提供两种类型的计时器Timer和Ticker。Timer经过指定的duration时间后被触发,往自己的时间channel发送当前时间,此后Timer不再计时。Ticker则是每隔duration时间都会把当前时间点发送给自己的时间channel,利用计时器的时间channel可以实现很多与计时相关的功能。 文章主要涉及如下内容: Timer和Ticker计时器的内部结构表示 Timer和Ticker的使用方法和注意事项 如何正确Reset定时器 计时器的内部表示 两种计时器都是基于Go语言的运行时计时器runtime.timer实现的,rumtime.timer的结构体表示如下: type timer struct { pp puintptr when int64 per...阅读全文

并发简介

有人把Go语言比作 21 世纪的C语言,第一是因为Go语言设计简单,第二则是因为 21 世纪最重要的就是并发程序设计,而 Go 从语言层面就支持并发。同时实现了自动垃圾回收机制。 Go语言的并发机制运用起来非常简便,在启动并发的方式上直接添加了语言级的关键字就可以实现,和其他编程语言相比更加轻量。 下面来介绍几个概念: 进程/线程 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。 线程是进程的一个执行实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。 一个进程可以创建和撤销多个线程,同一个进程中的多个线程之间可以并发执行。 并发/并行 多线程程序在单核心的 cpu 上运行,称为并发;多线程程序在多核心的 cpu 上运行,称为并行。 并发...阅读全文

博文 2020-03-25 23:32:49 乔大叶_803e

《Go语言程序设计》读书笔记(六) 基于共享变量的并发

竞争条件 在一个线性(就是说只有一个goroutine的)的程序中,程序的执行顺序只由程序的逻辑来决定。在有两个或更多goroutine的程序中,每一个goroutine内的语句也是按照既定的顺序去执行的,但是一般情况下我们没法知道分别位于两个goroutine的事件x和y的执行顺序,x是在y之前?之后?还是同时发生?是没法判断的。当我们没有办法确认一个事件是在另一个事件的前面还是后面发生的话,就说明x和y这两个事件是并发的。 一个函数在线性程序中可以正确地工作。如果在并发的情况下,这个函数依然可以正确地工作的话,那么我们就说这个函数是并发安全的,并发安全的函数不需要额外的同步工作。我们可以把这个概念概括为一个特定类型的一些方法和操作函数,如果这个类型是并发安全的话,那么所有它的访问方法和操...阅读全文

博文 2020-01-04 12:32:41 Kevin

Go关键字defer的特性

Go里面,流程控制语句中有一个defer的关键字,翻译过来就是延迟的意思。下面用代码说话。 func deferFunc() { defer fmt.Println("后打印") fmt.Println("先打印") } defer在函数执行完毕之后,才会执行,所以,我们经常在释放资源或异常处理等需要收尾的场景下会用到defer。 不过defer也有一些“坑”,大家需要注意一下。 func printNumbers() { for i := 0; i < 5; i++ { defer func() { fmt.Print(i) // 输出55555 }() } } 上面例子中,defer是在for循环全部执行完毕之后才会执行,所以i已经变成了5,正确做法是下面这样 func printNum...阅读全文

博文 2020-02-26 15:32:40 iuoui

Golang基础(四) | 结构体

结构体 Go语言中,也和C或者其他语言一样,我们可以声明新的类型,作为其它类型的属性或字段的容器。例如,我们可以创建一个自定义类型person代表一个人的实体。这个实体拥有属性:姓名和年龄。这样的类型我们称之struct。如下代码所示: type person struct { name string age int } 声明一个struct如此简单,上面的类型包含有两个字段 一个string类型的字段name,用来保存用户名称这个属性 一个int类型的字段age,用来保存用户年龄这个属性 具体的使用方式如下: type person struct { name string age int } var P person // P现在就是person类型的变量了 P.name = "Asta...阅读全文

博文 2020-03-06 23:32:48 youzhihua

(转)Go blog (The Laws of Reflection)翻译

The Laws of Reflection (https://blog.golang.org/laws-of-reflection) 简介   Reflection(反射)在计算机中表示程序能够检查自身结构的能力,尤其是类型。它是元编程的一种形式,也是最容易让人迷惑的一部分。   本文中,我们将解释Go语言中反射的运行机制。每个编程语言的反射模型不大相同,很多语言索性就不支持反射(C、C++)。由于本文是介绍Go语言的,所以当我们谈到"反射"时,默认为是Go语言中的反射。 阅读建议   本文中,我们将解释Go语言中反射的运行机制。每个编程语言的反射模型不大相同,很多语言索性就不支持反射(C、C++)。   由于本文是介绍Go语言的,所以当我们谈到“反射”时,默认为是Go语言中的反射。   ...阅读全文

博文 2019-03-14 01:34:39 one_zheng

Golang学习笔记-测试

Go的标准库提供了几个与测试有关的库,其中最主要的是testing包,testing包需要与go test命令以及源代码中所有以_test.go后缀结尾的测试文件一同使用,一般测试文件的名字都会与被测试源码文件的名字相对应,例如main.go的测试文件名为mian_test.go。 功能测试 为了测试源代码,我们需要在测试文件中创建具有以下格式的测试函数,其中Xxx首字符必须是大写的英文字母,在测试函数的内部,我们可以使用Error,Fail等一系列方法表示测试失败。 func TestXxx(t *testing.T){...} testing.T结构有几个非常有用的方法: Log():将给定的文本记录到日志。 Logf():根据给定的格式,将给定的文本记录到日志。 Fail():将测试函...阅读全文

博文 2019-12-29 14:32:39 土豆吞噬者

说说 Go 中的变量(附粗制滥造面试题)

和其他语言没有区别,Go 中的数据也是两种表示方式,常量和变量,本文先说说变量吧。 为了增加文章的趣味性(多掉些头发),文末搜集了一些常见的面试题。部分是自己瞎编的,顺便为自己明年可能到来的面试做些准备。 什么是变量 变量是可以理解为使用一个名称绑定一个用来存放数据的内存块。 变量,首先是量,即为数据,而后是变,即表示内存块中的数据是可变的。与变量相对的是常量,常即恒常,表示数据不可变。常量的值是在编译期就确定了。 变量的定义 Go 中变量的定义有多种方式,先看一个变量完整的定义组成。如下: 变量名称 变量类型 变量值 var varName typeName [= Value] var 是 Go 提供的用于定义变量的关键词,变量的定义语句可出现在函数和包级别中。 语句中核心是三个部分,分别...阅读全文

博文 2019-12-06 11:32:38 波罗学

1.go语言之常量和变量

1.标识符与关键字 1.1标识符 在编程语言中,标识符就是程序员定义的具有特殊意义的词。比如变量名、常量名、函数名等。 Go语言中的标识符由字母,数字和_(下划线)组成,只能以字母和_(下划线)开头。 例如:abc,_abc,_123,a123。 1.2关键字 关键字是编程语言中预先定义好的具有特殊含义的标识符。关键字和保留字都不建议用于变量名。 Go 语言中有25个关键字: break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var Go语言中有...阅读全文

博文 2019-12-10 17:34:21 DevOperater

go web 框架-day1

用go 来实现一个极简的web框架,框架虽然简单,但是里面也包括了核心内容,对需要学习web框架的人开说是一个不错的学习路径。简单的web框架主要包括端口监听,获取请求和路由响应。go里面本身带有http库来实现这些功能。第一天的代码主要分为两部分,1是main函数入口,2是框架部分。我们先看看main函数 func main() { r := gee.New() r.Get("/",func(w http.ResponseWriter,r* http.Request){ fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path) }) r.Get("/hello", func(w http.ResponseWriter, req *http.Request)...阅读全文

博文 2020-04-06 11:32:44 对方正在输入_7c4d

Go 语言学习笔记-文件操作

打开、创建文件 创建文件 Create file, err := os.Create("F:/futureWeb/goLang/testFile.go") 参数:name。打开文件的路径:绝对路径、相对路径 目录分隔符:/ 文件不存在,则创建。文件存在,则将文件内容清空。 打开文件 Open 参数:name。打开文件的路径:绝对路径、相对路径 以只读方式打开文件。文件不存在,则打开失败。 f, err := os.Open("F:/futureWeb/goLang/testFile.go") 打开文件 OpenFile f, err := os.OpenFile("F:/futureWeb/goLang/testFile.go", os.O_RDONLY, 6) 参数1:name。打开文件的...阅读全文

博文 2020-04-12 19:32:42 梁坤同学

Go语言实战阅读学习第三章

个人总结 1.go编译时会把名为main的包进行编译为二进制可执行文件,因此main是整个代码项目的程序入口 2.导入包时,标准库的包会在安装go的位置找到,开发者创建或者需要下载的包,会在GOPATH位置寻找寻找的顺序是首先从go安装目录,找到就停止,反之再GOPATH位置继续找。 3.每个包可以包含多个init函数,在导入时加上”_“使其工作 4.go工具有编译build,检测vet,格式化fmt,包文档doc,包依赖工...阅读全文

博文 2020-04-14 16:32:46 赵小毅

go 的基本数据类型

4. 类型 下面是 Go 支持的基本类型: bool 数字类型 int8, int16, int32, int64, int uint8, uint16, uint32, uint64, uint float32, float64 complex64, complex128 byte rune string bool bool 类型表示一个布尔值,值为 true 或者 false。 package main import "fmt" func main() { a := true b := false fmt.Println("a:", a, "b:", b) c := a && b fmt.Println("c:", c) d := a || b fmt.Println("d:", d) ...阅读全文

博文 2019-04-03 18:35:09 听砜

Go语言入门:Hello world

本文是「vangoleo的Go语言学习笔记」系列文章之一。官网: http://www.vangoleo.com/go/go-hello-world/ 在上一篇文章你好,Go语言中,我们对Go语言的历史和特点有了认识。接下来,我们就正式进入Go的学习了。按照大部分编程语言的惯例,我们以经典的“Hello World”开始Go语言的学习之旅。 经典的“Hello World”案例来自于1978年出版的C语言圣经。很巧合的是该书的作者Brian W. Kernighan也是《Go语言圣经》一书的作者。 本教程中,我会使用最方便的方式Golang Playground来体验Go语言。在浏览器中打开https://play.golang.org...阅读全文

博文 2019-11-05 23:32:45 vangoleo

假期笔记

不能盲目优化 一是在追求速度的时候抓不住重点。比如在没有一个完善的测量系统不知道瓶颈在哪就开始优化,花了一个多月软件提高了半个毫秒结果发现别人一个网络改动一下省10毫秒。小公司在进行大优化之前不估算投入产出比,耗费大量软硬件开发资源做对策略影响不大的改进。比如没弄清楚情况自己策略情况就强行上FPGA团队的。 虚拟语气 couldn't agree more,表示十分同意。 can't agree anymore表示十分同意是错误的,字面意思是,不能再继续同意下去了。 并发编程模型 共享数据,加锁 如c和java的并发编程。使用共享数据方式的并发编程面临的最大的一个问题就是数据条件竞争(data race)。处理各种锁的问题是让人十分头痛的一件事。 消息传递 消息传递机制最大的优点就是不会产生...阅读全文

博文 2020-02-27 07:32:41 sunboximeng

Golang 学习笔记:反射

反射(Go Reflect) 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。 程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。 支持反射的语言可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们。 反射就是在运行时动态的获取一个变量的类型信息和值信息。 每种语言的反射模型都不同,并且有些语言...阅读全文

博文 2020-06-03 14:32:50 sunlingbot

Lite语言——从入门到放弃(二)

github.com/kulics/lite​这次我们来看看 Lite 的函数和结构设计。 函数声明 在 Lite 中,函数声明的格式为 # id(->) {} # function(->) { # 函数逻辑 # a = 1 + 1 } 这是一个没有参数也没有返回值的函数。 函数的调用方式和其它大部分语言一样。 # 调用 # function() 参数 函数的参数定义与定义变量的方式一样,写在函数定义括号箭头前面部分,多个参数用逗号隔开。 # 声明参数 # processInt(x int, y int ->) { a = x + y } # 调用传参 # processInt(1, 2) 返回值 函数可以输出返回值,这样就可以将处理后的数据返回给调用者去使用。 函数的返回值定义与参数定义相...阅读全文

博文 2019-07-23 13:02:37 kulics

jQuery的keydown()方法有什么用?

keydown()是jQuery中的一个内置的方法,每当用户按下键盘上的键时,它都会触发keydown事件。如果一直按下该键,则每次操作系统重复该键时都会发送事件。所以,使用keydown()方法,我们可以检测是否有任何键正在向下移动。 原文地址:jQuery的keydown()方法有什么用?keydown() 方法触发 keydown 事件,或规定当发生 keydown 事件时运行的函数。语法:$(selector).keydown(function)selector表示选中的元素。参数:它接受一个可选参数,指定keydown事件触发时运行的函数。说明:与 keydown 事件相关的事件顺序1、keydown - 键按下的过程2、keypress - 键被按下3、keyup - 键被松开示...阅读全文

博文 2020-03-27 01:32:52 yanghs

golang 结构体

构造函数,可以使用普通方法来构建 值接受者和指针接收者 1、要改变内容必须使用指针接收者 2、结构过大也要考虑使用指针接收者 3、一致性;如有指针接收者,最好都是指针接收者 值接收者是go语言特有 值/指针接收者均可接收值/指针 nil指针也可以调用方法(.) 封装 对包而言的 每个目录只能一个包,main包包含程序入口 为结构定义的方法必须放在同一个包内,可以在不同文件...阅读全文

博文 2020-06-08 01:33:14 我真是刚的不像话

[Go 教程系列笔记]结构而不是类-Go中的OOP

Go 教程系列笔记 Interface 第一部分 Go 教程系列笔记 Interface 第二部分 Go 教程系列笔记 并发介绍 Go 教程系列笔记 goroutine(协程) Go 教程系列笔记 Channel 通道 Go 教程系列笔记 缓冲通道和工作池 Go 教程系列笔记 Select Go 教程系列笔记 Mutex(互斥锁) Go 教程系列笔记 结构而不是类-Go中的OOP Go 教程系列笔记 组合而不是继承-Go 中的 OOP Go 教程系列笔记 多态-Go 中的 OOP Go 面向对象? Go 不是纯粹的面向对象编程语言。摘自Go的常见问题解答,回答了Go是否面向对象的问题。 Yes and no. Although Go has types and methods and all...阅读全文

博文 2019-08-14 17:02:51 xfstart07

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

> NSQ 消息队列实现消息落地使用的是 FIFO 队列。 > 实现为 **diskqueue** , 使用包 `github.com/nsqio/go-diskqueue` ,本文主要对 `diskqueue`的实现做介绍。 ## 功能定位 - 在NSQ 中, diskqueue 是一个实例化的 BackendQueue, 用于**保存在内存中放不下的消息**。使用场景如Topic 队列中的消息,Channel 队列中的消息 - 实现的功能是一个FIFO的队列,实现如下功能: - **支持消息的插入、清空、删除、关闭操作** - **可以返回队列的长度**(写和读偏移的距离) - 具有读写功能,FIFO 的队列 ## diskqueue 的实现 BackendQue...阅读全文

博文 2020-04-09 11:07:18 lpflpf

golang基本题目相关

package main import ( "fmt" "runtime" "strings" "sync" "time" "unsafe" ) //死锁 func main01() { t := time.NewTicker(time.Second * 5) // defer t.Stop() 解决死锁方案,在此处用defer关闭 for range t.C { fmt.Println(1) //stop关闭信号,不关闭通道通信,导致死锁 // t.Stop() } } //字符串处理 func main02() { //只要字符串包含fedabc任何一个就去掉,而且和顺序无关,所以整体都被去除了 s := strings.TrimRight("abcdefedcba", "fedabc"...阅读全文

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

24. 理解 Go 语言中的协程:goroutine

Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:golang.iswbm.com 我的 Github:github.com/iswbm/GolangCodingTime 说到Go语言,很多没接触过它的人,对它的第一印象,一定是它从语言层面天生支持并发,非常方便,让开发者能快速写出高性能且易于理解的程序。 在 Python (为Py为例,主要是我比较熟悉,其他主流编程语言也类似)中,并发编程的门槛并不低,你要学习多进程,多线程,还要掌握各种支持并发的库 asyn...阅读全文

博文 2020-06-01 11:34:41 王一白

[Go - Basic] Time相关

import "time" 类型 type Time struct { wall uint64 ext int64 loc *Location } type Month int type Weekday int type Duration int64 常用函数和方法 函数: Now() Time 当前Time Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time //返回一个设置的time类型 Since(t Time) Duration //time.Now().Sub(t) Unix(sec int64, nsec int64) Time // 时间戳转时间 1sec = 1nsec ...阅读全文

博文 2019-12-06 11:32:38 Arboat