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

【Go语言】【6】GO语言的数组

在《【4】GO语言类型和为类型增加方法》里说过GO语言除了基础类型(如int、float64、complex128等)之外,还有复合类型,其中就包含本文的数组。对于数组大家都不陌生,在C语言中可以这样声明一个一维数组:int arr[10],那么GO语言是怎么定义的呢?一、数组的声明1、数组的声明格式为var arrName [num]type,比如:var strArr [10]string // 声明一个由10个字符串组成的一维字符串数组var byteArr [32]byte // 声明一个由32个byte组成的一维byte数组var pointArr [12]*float64 // 声明一个由12个指向float64类型的指针组成的一维指针数组var twoArrs [3][5]in...阅读全文

博文 2017-02-09 15:58:13 qingkechina

Go的异常处理 defer, panic, recover

Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常。在Go语言中,使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,也就是说,遇到真正的异常的情况下(比如除数为0了)。才使用Go中引入的Exception处理:defer, panic, recover。 这几个异常的使用场景可以这么简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。 例子代码: package main import "fmt" func main(){ ...阅读全文

博文 2014-10-26 23:14:49 ghj1976

Go的异常处理 defer, panic, recover

这是抄来的: 原文地址: http://www.cnblogs.com/ghj1976/archive/2013/02/11/2910114.html Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常。在Go语言中,使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,也就是说,遇到真正的异常的情况下(比如除数为0了)。才使用Go中引入的Exception处理:defer, panic, recover。 这几个异常的使用场景可以这么简单描述:Go中可以抛出一个panic的异常,然后...阅读全文

博文 2015-03-26 03:00:00 edwin032602

Golang函数执行模板(log,耗时,panic)

有些函数执行前后,需要加日志、记录耗时、还要处理panic,都是些重复性的东西。 所以弄了个模板式的东西,碰到这类需求,直接把相关函数和参数,丢到run函数去就不用管了,省得浪费时间。 先上个调用例子: //函数执行模板 //author: Xiong Chuan Liang //date: 2015-3-19 package main import ( "fmt" "log" "os" "utils" ) func main() { log.SetOutput(os.Stdout) w := utils.NewWorker() w.Run("myPrintf()", myPrintf, "aa", "bb") } func myPrintf(args ...interface{}) (in...阅读全文

博文 2015-06-17 20:23:36 xcltapestry

mgo写入安全机制

mgo写入安全机制 mongo写入安全 mgo写入安全 mongo写入安全 mongo本身也有一整套的写入安全机制,但是在这篇的内容里只介绍一小部分相关部分.先放一个链接可以跳过本节不看直接看这个 链接. WriteConcern.NONE:没有异常抛出 WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常 WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。 WriteConcern.MAJORITY: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。 WriteConcern.FSYNC_SAFE: 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。 WriteConcern.JOURN...阅读全文

博文 2016-07-27 15:00:01 xinglong

golang内存分配

http://www.cnblogs.com/yjf512/p/5147365.html 2016-01-21 10:09 by 轩脉刃, 173 阅读, 2 评论, 收藏, 编辑 golang内存分配 new一个对象的时候,入口函数是malloc.go中的newobject函数 func newobject(typ *_type) unsafe.Pointer { flags := uint32(0) if typ.kind&kindNoPointers != 0 { flags |= flagNoScan } return mallocgc(uintptr(typ.size), typ, flags) } 这个函数先计算出传入参数的大小,然后调用mallocgc函数,这个函数三个参数,第...阅读全文

博文 2016-01-21 22:00:02 zdy0_2004

GO语言异常处理机制panic和recover分析

Golang 有2个内置的函数 panic() 和 recover(),用以报告和捕获运行时发生的程序错误,与 error 不同,panic-recover 一般用在函数内部。一定要注意不要滥用 panic-recover,可能会导致性能问题,我一般只在未知输入和不可靠请求时使用。 golang 的错误处理流程:当一个函数在执行过程中出现了异常或遇到 panic(),正常语句就会立即终止,然后执行 defer 语句,再报告异常信息,最后退出 goroutine。如果在 defer 中使用了 recover() 函数,则会捕获错误信息,使该错误信息终止报告。 示例: 复制代码代码如下: package main import ( "log" "strconv" ) //捕获因未知输入导致的程序...阅读全文

博文 2016-02-29 21:00:04 yangyangye

Go语言 异常处理

Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常。在Go语言中,使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,也就是说,遇到真正的异常的情况下(比如除数为0了)。才使用Go中引入的Exception处理:defer, panic, recover。 这几个异常的使用场景可以这么简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。 例子代码: package main import "fmt" func main(){ ...阅读全文

博文 2014-10-11 17:00:01 abv123456789

go的异常处理机制

在java或php等很多面向对象的语言中, 异常处理是依靠throw、catch来进行的。在go语言中,panic和recover函数在作用层面分别对等throw和catch语句,当然也存在不同之处。 从设计层面来看,panic和recover函数适用于那些真正的异常(例如整数除0),而throw catch finally机制常常被用来处理一些业务层面的自定义异常。因此在go语言中,panic和recover要慎用。 上述两种异常机制的使用中,在处理异常时控制流程的走向也是相似的。 下面将分别举例说明: try catch finally机制 try{ throw new Exception(); } catch(Exception $e) { do something ... } fin...阅读全文

博文 2017-07-20 05:04:53 Dr_Zhang

go文件操作

go语言支持的文件操作很多 1、传统的文件操作 导入文件操作需要的包 import "os" 1、文件的打开 f := os.Open(filepath) 2、文件的读取 f.Read([]byte) 3、文件的关闭 f.Close() 这里写代码片 openfile, err := os.Open(“test.go”)//正确打开文件返回err := nil //这里如果文件打开异常,则抛出错误 if err != nil { //panic函数会终止程序的运行,并且打印错误相当于C/C++中的assert()函数 panic(“open file error”) } //defer相当于C++中的析构函数,在程序结束之前,运行其后的函数 defer openfile.Close() //...阅读全文

博文 2016-05-27 15:00:03 u010165367

golang学习的点点滴滴:异常机制

func main() { // defer 必须在异常抛出之前 // 下面如果有异常抛出(或人为panic) // 则停止往下执行,跳转到defer后的代码块进行收尾工作 // 即便不会抛出异常,最后也会执行defer后的代码进行收尾 // 用recover处理异常信息,当err为空时,则证明没有任何异常抛出 // 如果不为空,则进行异常处理 defer func() { if err := recover();nil!=err { fmt.Println(err) } fmt.Println("can show..") }() f() } func f() { fmt.Println("heihei") panic("oh! error") //手工抛出异常, 不管这里抛不抛异常,上面的...阅读全文

博文 2014-10-04 19:27:41 亓斌哥哥

go 为方便单元测试的函数

写go语言程序,在单元测试时,经常需要比较两个值是否相等,比较一个值是否为nil,或者是否抛出了panic。分别写了如下三个函数来进行判断。具体应用时,可以根据实际情况进行调整。 func verify(t *testing.T, fun string , output, expected interface{}){ if output != expected { t.Errorf( "%s: output %v != %v", fun, output, expected) } } func verifyNil(t *testing.T, fun string , output interface{}){ v := reflect.ValueOf(output) if v.IsValid()...阅读全文

博文 2016-04-27 02:00:02 logsharp

兄弟连区块链培训Go语言panic和recover(捕获异常)

随着区块链引发的“颠覆风暴”,大量区块链培训机构应运而生。但在鱼龙混杂的培训圈内,要想找到真正符合标准的课程体系与专属区块链领域的专业授课讲师简直是沧海一粟。兄弟连教育指出,是时候做出行动改变并颠覆传统培训机构运营思维,并提醒大众用户,应理性选择区块链培训机构。func panic(interface{})和func recover() interface{}是Golang中用于错误处理的两个函数。panic的作用就是抛出一条错误信息,从它的参数类型可以看到它可以抛出任意类型的错误信息。在函数执行过程中的某处调用了panic,则立即抛出一个错误信息,同时函数的正常执行流程终止,但是该函数中panic之前定义的defer语句将被依次执行。之后该goroutine立即停止执行。recover()...阅读全文

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

Go - 以任意类型的slices作为输入参数

Go - 以任意类型的slices作为输入参数(译) 2014-01-16 Thu By youngsterxyf 原文:Go – taking slices of any type as input parameters 译者:youngsterxyf 最近参与的一个业余项目,go-linq,让我了解到Go语言的类型系统并不是为任何类面向 对象编程而设计的。没有泛型,没有类型继承,也没有提供任何对这些特性有用的东西。 但是,提供了一个名为interface{}的类型,你可以向其赋予几乎任意类型的值,不会抛出编译错误,就像.NET的Object或Java的Object: var o interface{} o := 3.14 o := Student{Name: "Ahmet"} 我们假设你...阅读全文

博文 2016-05-20 17:00:02 hittata

ERC721协议详解 --Solidity

pragma solidity ^0.4.20; /// Note: the ERC-165 identifier for this interface is 0x80ac58cd. interface ERC721 /* is ERC165 */ { //变更NFT所有权//NFT的创建和销毁时触发//除外情况:创建合约时,不需要transfer也可以创建和分配NFT//发起transfer时,approved address会被重置为none event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); //在NFT的approved address变更或重新确认时被触发。//z...阅读全文

博文 2018-12-19 18:34:44 kakushao

Go的异常处理 defer, panic, recover

Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常。在Go语言中,使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,也就是说,遇到真正的异常的情况下(比如除数为0了)。才使用Go中引入的Exception处理:defer, panic, recover。 这几个异常的使用场景可以这么简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。 例子代码: package main import "fmt" func main(){ ...阅读全文

博文 2016-02-28 22:00:00 u013542440

Go的异常处理 defer, panic, recover

Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常。在Go语言中,使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,也就是说,遇到真正的异常的情况下(比如除数为0了)。才使用Go中引入的Exception处理:defer, panic, recover。 这几个异常的使用场景可以这么简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。 例子代码: package main import "fmt" func main(){ ...阅读全文

博文 2014-10-11 01:00:00 wuwenxiang91322

golang:errors

今天来讲讲golang中最不优雅的东西,错误处理!在常用的高级语言中,我们的异常抛出可以使用throw exception,然后使用try catch来捕获异常(异常和逻辑错误都混在一起使用),异常类型细分的话可以自定义很多exception子类。但是在golang中我们却不能这样做,我们只能通过检查返回值来判断错误类型。(golang 中通过panic和recover来处理异常)今日代码package main import "errors" import "fmt" func f1(arg int) (int, error) { if arg == 42 { return -1, errors.New("can't work with 42") } return arg, nil } t...阅读全文

博文 2016-10-20 07:00:01 u012798391

Golang 让你欢喜、让你忧....

主题: 今天小试了一下Golang 一个小时吧! 对于习惯了C/C++ 、Python、lua语法的我,上手难度不高,很随意就写出了几个简单的小程序。 但是这个随意也让你在某些地方卡壳了一下: 1、 编译的时候,参数的问题; 2、 包引入机制方面; 3、 语法特点上面; 首先建立3个文件夹: 1、src 2、bin 3、pkg 让我恼怒: 1、 就是万恶的import 与package玩法了。 也许是为了配合build project中的自动构建吧!反正为了调试import文件,我是整了将近半小时。而且最可恨的是前面花费的25分钟我都不知道错在哪? 什么?你说我没仔细看Golang的文章!好吧,如果不仔细看,鬼才会知道import导出方法必须得首字母大写?package 是可以将一个文件切分...阅读全文

博文 2016-10-14 17:00:14 水果糖

Golang中的panic和recover(捕获异常)

func panic(interface{})和func recover() interface{}是Golang中用于错误处理的两个函数。 panic的作用就是抛出一条错误信息,从它的参数类型可以看到它可以抛出任意类型的错误信息。在函数执行过程中的某处调用了panic,则立即抛出一个错误信息,同时函数的正常执行流程终止,但是该函数中panic之前定义的defer语句将被依次执行。之后该goroutine立即停止执行。 recover()用于将panic的信息捕捉。recover必须定义在panic之前的defer语句中。在这种情况下,当panic被触发时,该goroutine不会简单的终止,而是会执行在它之前定义的defer语句。 下面是一个简单的例子: -->捕捉自己设置的panic错误...阅读全文

博文 2018-08-16 15:30:01 zhzhlong

激光切割机排版软件

激光切割机排版软件【电同微I7I54833762】try/catch基本上是大家最常和async/await的,基本上我们会用它去包围大部分的异步方法。await关键字后面的promise一旦reject了,就会抛出一个异常错误。run();asyncfunctionrun(){try{awaitPromise.ject(newError('Oops!')); }catch(err) {console.error(error.message); }}复制代码try/catch同样也可以处理同步的错误,比如下面:asyncfunctionrun(){constv =null;try{awaitPromise.resolve('foo'); v.thisWillThrow; }catch(err...阅读全文

Go-Maps

语法汇总 前面介绍的array、slice都是顺序性列表,本节的map则是无序的。 这个map和C/C++/Java的map一样,在Python中称为字典/dictionary。但Golang中map的用法更符合脚本语言的特点,和Python很像。 涉及的主要语法点: var the_map map[string]int the_map := make(map[string]int) the_map := map[string]int {key:value, ...} value, ok := the_map[key] 示例-基本用法 下面这个例子给出了map的声明方法。但通常并不这么使用,因为这种声明之后必须要调用make()初始化之后才可赋值,与其这样,不如直接:= make()这种方式...阅读全文

博文 2016-08-31 15:00:05 u013344915

悲观锁 在关系数据库管理系统里,悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)是一种并发控制的方法。它可以阻止一个事务以影响其他用户的方式来修改数据。如果一个事务执行的操作都某行数据应用了锁,那只有当这个事务把锁释放,其他事务才能够执行与该锁冲突的操作。 悲观并发控制主要用于数据争用激烈的环境,以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本的环境中。 在数据库中,悲观锁的流程如下: 在对任意记录进行修改前,先尝试为该记录加上排他锁(exclusive locking)。 如果加锁失败,说明该记录正在被修改,那么当前查询可能要等待或者抛出异常。 具体响应方式由开发者根据实际需要决定。 如果成功加锁,那么就可以对记录做修...阅读全文

博文 2018-05-11 16:03:37 lobo

Go语言异常处理defer\panic\recover

Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常。在Go语言中,使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,也就是说,遇到真正的异常的情况下(比如除数为 0了)。才使用Go中引入的Exception处理:defer, panic, recover。 这几个异常的使用场景可以这么简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。 例子代码: package main import "fmt" func main(){...阅读全文

博文 2016-03-01 11:00:00 zsy

go 变量的定义

3. 变量 变量是什么 变量指定了某存储单元(Memory Location)的名称,该存储单元会存储特定类型的值。在 Go 中,有多种语法用于声明变量。 声明单个变量 var name type 是声明单个变量的语法。 package main import "fmt" func main() { var age int // 变量声明 fmt.Println("my age is", age) } 语句 var age int 声明了一个 int 类型的变量,名字为 age。我们还没有给该变量赋值。如果变量未被赋值,Go 会自动地将其初始化,赋值该变量类型的零值(Zero Value)。本例中 age 就被赋值为 0。如果你运行该程序,你会看到如下输出: my age is 0 变量可以...阅读全文

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

golang异常处理

package main import ( "fmt" ) type TryTarget func() type CatchTarget func() func TryAndCatch(target TryTarget, catch CatchTarget) { defer func() { if err := recover(); err != nil { catch() } }() target() } func main() { TryAndCatch(func() { panic("抛出异常") }, func() { fmt.Println("异常恢复") }) } 先别说话,亮出代码,关于golang程序的异常处理涉及到三个关键字: 1.panic 把异常抛出去,一旦抛出异常该函...阅读全文

博文 2017-01-14 19:00:12 醉人的笑容你有没有

golang test 说明解读

本文为转载,原文地址:http://www.cnblogs.com/yjf512/archive/2013/01/22/2870927.html go test是go语言自带的测试工具,其中包含的是两类,单元测试和性能测试 通过go help test可以看到go test的使用说明: 格式形如: go test [-c] [-i] [build flags] [packages] [flags for test binary] 参数解读: -c : 编译go test成为可执行的二进制文件,但是不运行测试。 -i : 安装测试包依赖的package,但是不运行测试。 关于build flags,调用go help build,这些是编译运行过程中需要使用到的参数,一般设置为空 关于pack...阅读全文

博文 2014-10-04 19:27:29 koalaone

golang延迟函数defer

golang的defer优雅又简洁, 是golang的亮点之一。defer在声明时不会立即执行,而是在函数return后,再按照先进后出的原则依次执行每个defer,一般用于释放资源、清理数据、记录日志、异常处理等。 下面举个例子: package main import "fmt" func deferTest(number int) int { defer func() { number++ fmt.Println("three:", number) }() defer func() { number++ fmt.Println("two:", number) }() defer func() { number++ fmt.Println("one:", number) }() retu...阅读全文

博文 2016-11-17 18:00:11 yongche_shi

斩获微软offer后,我总结出这10个面试必备技巧

前言在18年底到19年3月,陆续面试了几家公司,有成有不成的,最终进了一家比较满意的知名外企。在本文里,我将介绍我这段时间里更新简历和面试的相关经历,从相关实战性的例子中进一步体会到面试技巧的使用方法。正文1 刚开始一定得通过一些小公司练手我打算要换工作,就更新了简历,这时就有不少猎头来找我,刚开始,我不敢面大公司,只是去些规模小的互联网公司。因为一方面,当时我很久不面试了,面试实战技能难免有些荒废,另一方面,离我之前的面试毕竟过了一阵,我不知道当前市面上哪些技术比较值钱。而且,我在面试前会准备一些针对项目和值钱技术的说辞,这些说辞总要经过实战来演练下。事实上,在和小公司沟通的过程中,进一步提升了我的相关表述能力和相关话术,相当于用小公司来踩坑。相反,如果用大公司的面试失败来换得这些进步,就...阅读全文

博文 2019-07-28 19:08:58 wyygxly

golang test说明解读

go test是go语言自带的测试工具,其中包含的是两类,单元测试和性能测试 通过go help test可以看到go test的使用说明: 格式形如: go test [-c] [-i] [build flags] [packages] [flags for test binary] 参数解读: -c : 编译go test成为可执行的二进制文件,但是不运行测试。 -i : 安装测试包依赖的package,但是不运行测试。 关于build flags,调用go help build,这些是编译运行过程中需要使用到的参数,一般设置为空 关于packages,调用go help packages,这些是关于包的管理,一般设置为空 关于flags for test binary,调用go hel...阅读全文

博文 2015-06-17 20:17:40 kjfcpua

golang使用go-sql-driver实现mysql增删改操作

这两天用golang 写的服务端做的都是和redis做交互,因为后期还会用mysql的一个表做验证。 先学习下golang对mysql的操作 ! mymysql和go-mysql-driver是两个现在都很流行的go的mysql驱动,看了下文档,后者比较的健全,听大牛们介绍,貌似go-mysql-driver更加的健全。 安装配置还是那么简单,直接go get就可以了 好了,咱们就开始用go-sql-driver增删改查 先用go-sql-driver链接mysql !!! 一看就懂了,帐号:密码@模式 数据库,以及附带的参数 Python user@unix(/path/to/socket)/dbname root:pw@unix(/tmp/mysql.sock)/myDatabase?l...阅读全文

博文 2017-04-04 19:17:21 rfyiamcool

go

语言简介 go是强类型静态语言,也就是说在编译阶段就确定变量类型,并且转换类型需要显示转换,它有如下几个特点: 跟脚本语言相似,容易上手、容易流行 底层是c,性能好 对goroutine调度进行了封装,即在语言层面支持协程,对于开发者,用起来方便 编译过程 go以包的形式管理源程序,每个包至少包含一个go文件。编译的时候会把main包生成可执行文件放到bin目录下,其他包生成xx.a包文件放到pkg目录下。 可执行程序初始化过程 先执行main包的go文件,对依赖的包递归执行import、常量和变量初始化、init函数流程之后,初始化main自己的常量和变量、再依次执行init函数和main函数,示意图如下(竟然不能直接放图片,????):https://github.com/JJAWX/i...阅读全文

博文 2018-06-02 22:34:37 THZXQ

C# Golang Python类型转换

C#的类型转换 隐式转换: int--float,int--double,float--double,容量小的转换成容量大的,可以直接隐式转换 显示转换: 1.使用(目标type)待转换数据 (int)float,(int)double,(float)double#大的数据类型转换为小的数据类型 2.使用Convert类的转换方法 Convert.ToInt32() 转换为整型(int) Convert.ToChar() 转换为字符型(char) Convert.ToString() 转换为字符串型(string) Convert.ToDateTime() 转换为日期型(datetime) Convert.ToDouble() 转换为双精度浮点型(double) Conert.ToSingl...阅读全文

博文 2020-03-11 17:33:01 stardust_0000

golang package整理(strconv)

开发十年,就只剩下这套Java开发体系了 >>> //package strconv //与字符串相关的类型转换都是通过 strconv 包实现的 //任何类型 T 转换为字符串总是成功的 //将字符串转换为其它类型 tp 并不总是可能的,可能会在运行时抛出错误 parsing "…": invalid argument //获取程序运行的操作系统平台下 int 类型所占的位数 strconv.IntSize //**********数字类型转换到字符串**/ //返回数字 i 所表示的字符串类型的十进制数 strconv.Itoa(i int) string //将 64 位浮点型的数字转换为字符串,其中 fmt 表示格式(其值可以是 'b'、'e'、'f' 或 'g'),prec 表示精...阅读全文

博文 2018-09-23 00:33:10 ivandong_qifan

理解 go 类型系统

type 的分类在 Go 中所有需要被定义和声明的对象都是 type,int,string,function,pointer,interface,map,struct 等等。 和大多数计算机语言一样,Go type 默认包含常用的基础数据类型,boolean,numeric and string,这些类型称为 pre-declarered types,这些基础的数据又可以进一步构成更复杂的类型 array,struct,map,slice,channel 等。 Type 可以是带名称和不带名称的,称之为 named type 和 unnamed type。 Named Types 就是通过 type 关键字为一个已有的 type 起个别名,像这样 type NewType ExistingT...阅读全文

博文 2017-08-08 15:40:48 三月沙

多年C++开发使用经验总结

摘要 借着公司内和其他小组的一个分享,把自己几年来C++开发的一点思考总结一下。全篇没有高屋建瓴的观点,基本都是些细节方面的注意事项。希望能给大家提供一点帮助。 构建工具 C/C++世界里有不少的构建工具:make、autotools、scons、CMake、Bazel。但近几年比较流行的,也就是CMake和Bazel。所以这一部分,也就大概对比下这两个工具吧。 究竟该选择哪个工具,我觉得可以从如下几个方面来对比一下: 1、上手难度 因为Bazel采用了类似Python的语法,所以其学习曲线相比CMake要平缓一些。但当我们考虑上手难度时,除了学习曲线之外,还要考虑文档的完备性、该工具的通用性等各个角度。当综合考虑时,我觉得CMake是一个尽管保守但仍旧不错的选择。主要原因就在于,CMake...阅读全文

博文 2019-01-17 17:22:32 Yaphets123

一个Go新手关于beego框架的问题

#### 概要 刚接触GO不久,非常感兴趣,因为有PHP web开发经历,就直接上手beego 框架来重写以前的个人测试项目,遇到些问题,想咨询一下。以下是我遇到的问题 这是一个只有**api**的项目,所以在beego文档看的错误处理好像不合适(可能是我还不会用。。。) #### 问题 一:在beego 框架**api**开发如何实现全局异常的抛出,例如我查询失败时直接返回错误信息。this.Abort方法尝试了不行 二:在尝试很多方式 我想到下面这样一个抛出异常的方式 ``` //user.go type UserController strucy { beego.Controller } func (this *UserController) Add(){ //部分代码省略 userI...阅读全文

博文 2019-10-29 00:46:03 HiWilliam

Golang的水平组合思维(1)——interface wrapper function

什么是Golang的正交组合-水平组合思维:Tony Bai的博客 - Coding in GO way - Orthogonal Composition 这篇文章研究其中提到的 interface wrapper function。 //show/show.go package show type Shower interface { Show() } 这是一个最简单的,定义了一个Shower的接口并声明了Show方法,满足这个接口的类型Type.Show()将在屏幕显示用户定义的一段文字。 随后我们需要为这个Shower接口添加一个实例。例如我们添加一个数据类型使他能够显示Demo:user-string: //demo/demo.go package demo type Show st...阅读全文

博文 2019-03-06 21:34:41 Ovenvan

Golang的sync.WaitGroup

1.WaitGroup的用途 WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。 官方对它的说明如下: A WaitGroup waits for a collection of goroutines to finish. The main goroutine calls Add to set the number of goroutines to wait for. Then each of the goroutines runs and calls Done when finished. At the same time, Wait can be used to block until all gorou...阅读全文

博文 2018-11-12 11:35:10 L白水飘萍

JVM 一套卷,助你快速掌握优化法则

一:虚拟机内存图解JAVA 程序运行与虚拟机之上,运行时需要内存空间。虚拟机执行 JAVA 程序的过程中会把它管理的内存划分为不同的数据区域方便管理。虚拟机管理内存数据区域划分如下图:​数据区域分类:方法区: (Method Area)虚拟机栈 : (VM Stack)本地方法栈 : (Native Method Stack)堆: (Heap)程序计数器: (Program Counter Register)直接内存 : (Direct Memory)说明:1、程序计数器行号指示器,字节码指令的分支、循环、跳转、异常处理、线程恢复 (CPU 切换),每条线程都需要一个独立的计数器,线程私有内存互不影响, 该区域不会发生内存溢出异常。2、虚拟机栈是线程私有的,声明周期与线程相同,虚拟机栈是 J...阅读全文

博文 2019-02-14 21:18:03 person_limit

Go语言学习笔记 - 函数

函数 不支持 嵌套 (nested)、重载 (overload) 和 默认参数 (default parameter)。• 无需声明原型。• 支持不定长变参。• 支持多返回值。• 支持命名返回参数。• 支持匿名函数和闭包。使用关键字 func 定义函数,左大括号依旧不能另起一行。 func test(x,y int,s string) (int string) { //类型相同的相邻参数可合并。 n := x + y //多值返回必须用括号 return n, fmt.Sprintf(s,n) } 函数是第一类对象,可作为参数传递。建议将复杂签名定义为函数类型,以便于阅读。 func test(fn func() int) int { return fn() } type FormatFun...阅读全文

博文 2017-02-10 15:53:45 技术学习

Go 学习之路:异常处理defer,panic,recover

Go没有像Java那样的异常机制,它不能抛出异常。因为设计者们认为,将异常与控制结构混在一起容易使得代码变得混乱。于是乎引入Exception处理: defer,panic,recover; 简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。 例子代码: package main import "fmt" func demo(){ fmt.Println("Welcome, my name is fudomine") panic(400) fmt.Println("Hello") } func main(){ defer func(){ fmt.Println("defer start") errorMsg := recover()...阅读全文

博文 2018-06-29 17:34:41 fudomine

golang反射包的使用

golang反射在某些特定的场景非常有用,比如我在web开发的时候,可以通过反射将表单映射到结构体上面,并能通过结构体定义的tag属性自动验证数据数据格式是否正确,如下例子: 我们可以将form表单

<input type="text" name="Name" /> <input type="text" name="Age" />
映射到下面这个结构体里面去 type User struct{ Name string `valid:"String"` Age int `valid:"Int"` } TypeOf 获取类型信息 ValueOf获取值信息 package main import ( "fmt" "ref...阅读全文

博文 2016-09-12 12:00:35 haitgo

golang第三天

测试代码 hello.go package main import ( "errors" "math" "fmt" "time" "io/ioutil" ) /** * errors.New 可返回一个错误信息: */ func MySqrt(f float64) (float64, error) { if f < 0 { return 0, errors.New("f can not be negative number.") } return math.Sqrt(f), nil } type DivideError struct { dividee int divider int } /** 实现error接口中的Error()方法 */ func (dError *DivideErro...阅读全文

博文 2019-03-01 07:34:41 陌生人的头像

52.蛤蟆笔记go语言——defer使用场景

52.蛤蟆笔记go语言——defer使用场景 1. 简化资源的回收 比如: mu.Lock() defer mu.Unlock() 当然, defer 也有一定的开销, 也有为了节省性能而回避使用的 defer 的. 从简化资源的释放角度看, defer 类似一个语法糖, 好像不是必须的. 2. panic异常的捕获 defer 除了用于简化资源的释放外, 还是Go语言异常框架的一个组成部分. Go语言中, panic用于抛出异常, recover用于捕获异常. recover只能在defer语句中使用, 直接调用recover是无效的. 比如: packagemain import"fmt" funcmain(){ f() fmt.Println("Returnednormallyfrom...阅读全文

博文 2016-10-23 18:00:02 notbaron

Golang学习笔记之错误处理error、panic (抛出错误),recover(捕获错误)

一、error 错误表示程序中出现了异常情况。Go 语言通过内置的错误接口提供了非常简单的错误处理机制。 • error类型是go语言的一种内置类型,使用的时候不用特定去import因为它本质上是一个接口 error类型是一个接口类型,这是它的定义: type error interface { Error() string } (1)一个例子理解error package main import ( "fmt" "os" ) func main() { //试图打开一个并不存在的文件,这将会返回一个error f, err := os.Open("/test.txt") if err != nil { fmt.Println(err) //no such file or directory...阅读全文

博文 2018-12-10 21:34:44 学生黄哲

go语言中的接口

文:https://medium.com/rungo/interfaces-in-go-ab1601159b3a 翻译:devabel 接口是golang中实现多态性的唯一好途径。 什么是接口? 我们在结构和方法课程中讨论了很多关于对象和行为的内容。 我们学习了结构体(以及其他非结构类型)实现方法。 接口是一组方法签名的集合,然后我们可以定义一个结构体实现该接口所有方法。因此,接口就是定义了对象的行为。 例如,结构体Dog可以walk和bark, 如果一个接口声明了walk和bark的方法签名,而Dog实现了walk和bark方法,那么Dog就实现了该接口。 接口的主要工作是仅提供由方法名称,输入参数和返回类型组成的方法签名集合。 由类型(例如struct结构体)来声明方法并实现它们。 如果...阅读全文

博文 2019-02-14 18:34:45 devabel

Go的异常处理 defer, panic, recover<转载>

Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常。在Go语言中,使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,也就是说,遇到真正的异常的情况下(比如除数为0了)。才使用Go中引入的Exception处理:defer, panic, recover。 这几个异常的使用场景可以这么简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。 例子代码: package main import "fmt" func main(){ ...阅读全文

博文 2016-08-18 21:00:10 u011686226