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

Go 系列教程 —— 3. 变量

这是我们 Golang 系列教程的第 3 个教程,探讨 Golang 里的变量(Variables)。 你可以阅读 Golang 系列 [**教程第 2 部分:Hello World**](/articles/11755),学习如何配置 Golang,并运行 Hello World 程序。 ### 变量是什么 变量指定了某存储单元(Memory Location)的名称,该存储单元会存储特定类型的值。在 Go 中,有多种语法用于声明变量。 ### 声明单个变量 **var name type** 是声明单个变量的语法。 ```go package main import "fmt" func main() { var age int // 变量声明 fmt.Println("my age i...阅读全文

博文 2017-11-28 17:01:18 heyulong

golang fatal error: all goroutines are asleep - deadlock!

channel默认上是阻塞的,也就是说,如果Channel满了,就阻塞写,如果Channel空了,就阻塞读。阻塞的含义就是一直等到轮到它为止。单有时候我们会收到 fatal error: all goroutines are asleep - deadlock! 异常,这是如何呢? 代码例子: package main import "fmt" func main() { channel := make(chan string, 2) fmt.Println("1") channel <- "h1" fmt.Println("2") channel <- "w2" fmt.Println("3") channel <- "c3" // 执行到这一步,直接报 error fmt.Println...阅读全文

博文 2015-02-18 03:00:00 ghj1976

Golang学习笔记--log包

个人站:http://www.cloudnoter.com/?p=137 一、快速使用 Golang的log包短小精悍,可以非常轻松的实现日志打印转存功能。不用多说,log支持并发操作(即协程安全-相对于JAVA中的线程安全而言),其结构定义如下: type Logger struct { mu sync.Mutex // ensures atomic writes; protects the following fields prefix string // prefix to write at beginning of each line // 日志行前缀 flag int // properties // 日志打印格式标志,用于指定每行日志的打印格式 out io.Writer // ...阅读全文

博文 2015-06-17 20:03:44 cza55007

Go语言 常用日志记录方法

Go目前标准包中日志只是方便的实现日志记录的功能,这些日志都是基于fmt包的打印再结合panic之类的函数来进行一般的打印、抛出错误处理。 一个简单的日志记录代码例子: 代码来自:http://www.du52.com/text.php?id=114 package main import( "fmt" "log" "os" ) func main(){ logfile,err:=os.OpenFile("/Users/cybercare/tmp/test.log",os.O_RDWR|os.O_CREATE,0666) if err!=nil{ fmt.Printf("%s\r\n",err.Error()) os.Exit(-1) } defer logfile.Close() logg...阅读全文

博文 2014-10-10 12:00:00 abv123456789

golang学习的点点滴滴:异常处理 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-04 19:27:45 亓斌哥哥

go使用Defer的几个场景

Go 语言中的 defer 语句是 UNIX 之父 Ken Thompson 大神发明的, 是完全正交的设计. 也正因为 Go 语言遵循的是正交的设计, 所以才有了: “少是指数级的多/Less is exponentially more” 的说法. 因为是正交的设计, 最终得到的组合形式是指数级的组合形式. 相反, C++的特性虽然很多, 但是很多不是正交的设计, 而只是简单的特性罗列, 所以C++的很多地方是无法达到指数级的多的组合方式的. 但是学习成本却非常高. 简单的例子就是C++的构造函数和析构函数和C语言的函数和struct完全是互斥的. 具体的例子可以参考: C++去掉构造函数会怎么样? 关于 Go 语言中 defer 语句的详细介绍请参考: Defer, Panic, and...阅读全文

博文 2016-02-03 07:00:06 yangyangye

Go 系列教程 —— 17. 方法

欢迎来到 [Golang 系列教程](/subject/2) 的第 17 个教程。 ### 什么是方法? 方法其实就是一个函数,在 `func` 这个关键字和方法名中间加入了一个特殊的接收器类型。接收器可以是结构体类型或者是非结构体类型。接收器是可以在方法的内部访问的。 下面就是创建一个方法的语法。 ```go func (t Type) methodName(parameter list) { } ``` 上面的代码片段创建了一个接收器类型为 `Type` 的方法 `methodName`。 ### 方法示例 让我们来编写一个简单的小程序,它会在结构体类型上创建一个方法并调用它。 ```go package main import ( "fmt" ) type Employee struc...阅读全文

博文 2018-01-22 18:00:02 polaris

Go语言中异常处理painc()和recover()的用法

Go语言中异常处理painc()和recover()的用法 1、Painc用法是:用于抛出错误。Recover()用法是:将Recover()写在defer中,并且在可能发生panic的地方之前,先调用此defer的东西(让系统方法域结束时,有代码要执行。)当程序遇到panic的时候(当然,也可以正常的调用出现的异常情况),系统将跳过后面的代码,进入defer,如果defer函数中recover(),则返回捕获到的panic的值。 2、代码: package main import "fmt" func main() { fmt.Printf("hello world my name is %s, I'm %d\r\n", "songxingzhu", 26) defer func() { ...阅读全文

博文 2016-03-09 10:00:01 songxingzhu

Go语言panic和recover使用

package main import ( "fmt" ) func main() { f() fmt.Println("Returned normally from f.") } func f() { defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) fmt.Println("Recovered in f", r) } }() fmt.Println("Calling g.") g() fmt.Println("Returned normally from g.") } func g() { panic("ERROR") } panic 意思是抛出一个异常, 和python的raise...阅读全文

博文 2015-06-18 18:04:37 fyxichen

Golang-设置系统时间

// 接收UDP时间广播,并设置系统时间 func (sl *Slaver) masTimeSync(ch chan int) { // 开始监听广播时间 log.Printf("time sync listen [%s]", sl.Node.Port.PortUdpSlaTimeSync) for { (func() { // 监听 mas 发来的同步时间 lis, err := socket.NewListen("", sl.Node.Port.PortUdpSlaTimeSync, 3).ListenUDP() // 判断监听是否建立成功 if err != nil { // 异常抛出 log.Fatalln(err) } // 保证监听正常关闭 defer lis.Close() /...阅读全文

博文 2015-03-03 21:41:22 nulijiabei

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

文: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"} 我们假设你需要一个可以接收任意类型slices的函数,如果考虑如下这样实现: func Method(in []interfac...阅读全文

博文 2014-11-05 09:52:11 youngsterxyf

关于golang中的引用类型(reference type)

map,指针(pointers),还有slice,按照我的理解,这样的一个变量,存的就是个内存地址,而这样的一个声明 var a map[int]string var p *int var arr []string 在没有初始化之前都是nil,对这样的一个变量进行写(write)操作,都会抛出一个运行异常(a runtime panic),当然,append操作是可以的,或者用在声明的同时用make初始化一下也可以。 现在需要去验证的是,初始化的map或者slice是有一定默认空间的(尤其是map),如果不用append,直接a[x]=n来增加值,会不会越界抛出异常。。...阅读全文

博文 2016-06-13 14:00:02 hificamera

Go语言异常处理

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

博文 2014-12-10 17:00:06 newsyoung1

golang 判断是否实现interface接口的方法

由于golang的interface使用很灵活,不需要显示的实现接口interface的方法, 有点动态化的感觉, 缺点:如果没有实现interface的方法,强行转换成interface,运行时候异常报错 解决办法:在编译的时候就把这种错误抛出来,上代码: package main import ( "fmt" ) type value interface { Show() } type test_value struct{} // func (value *test_value) Show() { fmt.Printf("test \n") } var _ value = new(test_value) // 使用类似方法处理,编译的时候会报错 func main() { } // --...阅读全文

博文 2017-01-22 10:00:08 golang_yh

golang package整理(strconv)

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

博文 2015-08-01 09:00:02 ivandong_qifan

Go 语言的错误处理机制

载自:http://blog.iwinux.info/blog/2012/12/error-handling-in-go.html 这段时间在学习 Go 语言,接触到一些比较“另类”的语言特性,其中一个就是它的错误处理机制,跟我以往所知的都不太一样。在我正儿八经地使用过的编程语言(C / Python / Ruby / JavaScript)里面,处理程序错误的方式大致有两种:1. 返回特殊值 2. 抛出异常。 C 语言属于第一种。函数调用出错时会返回特殊值,并有可能根据场景设置某个全局的(一般是 thread-local 的)错误代码。比如 printf函数正常情况下返回的是已输出的字符数,如果出错,就返回负值。Linux (或其他遵循 POSIX 标准的 UNIX 系统) system ...阅读全文

博文 2014-10-24 15:00:16 kai_ding

Go语言学习笔记(四) [array、slice、map]

日期:2014年7月22日 一、array[数组] 1、定义:array 由 [n] 定义,n 标示 array 的长度,而 标示希望存储的内容的类型。 例如: var arr[10] int arr[0] = 1 arr[1] = 2 数组值类型的:将一个数组赋值给 另一个数组,会复制所有的元素。另外,当向函数内传递一个数组的时候,它将获得一个数组的副本,而不是数组的指针。 2、数组的复合声明。a :=[3]int{1,2,3}或简写为a:=[...]int{1,2,3}(Go会自动统计元素个数) 3、多维数组 例如:a := [2][2]int{ [2]int{1,2}, [2]int{3,4} } 等价于a := [2][2]int{ [...]int{1,2...阅读全文

博文 2014-10-22 18:27:38 whxaing2011

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-07 04:00:05 haitgo

Windows平台Go调用DLL的坑(居然有这么多没听过的名词)

最近的项目中,使用了GO来开发一些服务中转程序。业务比较简单,但是有一些业务需要复用原有C++开发的代码。而在WINDOWS,用CGO方式来集成C/C++代码并不是太方便。所以用DLL把C++的代码封装起来,然后提供基本的API来完成复用。在这个过程中遇到了一些问题及解决方法,记录下来,也给遇到类似或者同样问题的人一个借鉴。 如果你还不清楚怎么在GO中调用DLL,可以参考这篇文章《WindowDLLs》。 Callback的限制 在WINDOWS下调用一些API时会要求传入回调函数,在C/C++下使用非常简单,直接传入函数指针就可以了。但是在GO这种有GC特性,又有运行时库的语言要稍微麻烦一点。 GO为了解决这种回调要求,在syscall包里提供了NewCallback和NewCallbac...阅读全文

博文 2016-03-23 02:00:06 findumars

golang异常panic和恢复recover用法

go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理 在一个主进程,多个go程处理逻辑的结构中,这个很重要,如果不用recover捕获panic异常,会导致整个进程出错中断 package main import "fmt" func main() { defer func() { //必须要先声明defer,否则不能捕获到panic异常 fmt.Println("c") if err := recover(); err != nil { fmt.Println(err) //这里的err其实就是panic传入的内容,55 } fmt.Println("d") }() f() } func f() { fmt.Println("a") panic...阅读全文

博文 2015-06-18 08:02:32 ghost911_slb

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(){ ...阅读全文

博文 2015-06-27 01:00:04 helloworld20102010

go test 命令介绍

go 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,...阅读全文

博文 2015-04-08 13:00:05 csapr1987

go中的interface

用了9年的C++,1年的C#,最近改用go语言开发,深感go语言的设计简单,其设计宗旨也是less is more,它极大的加快了开发速度。 go语言吸取了很多现代语言的优点,一个比较重要的特性就是基于接口编程,函数是程序世界的第一公民,这个有点像scalar语言。实现这个接口的语言原型是interface。 基于接口编程 C++中不支持接口,接口的实现方式是用纯虚函数来实现的,C#具有接口,但是它认为接口是对象的一个能力,这是一个很大的进步,但是它不大灵活,比如 public Interface IFile { public int Read(string filePath, int len) public int Write(string filePath, int len) } 这个接...阅读全文

博文 2016-12-26 09:00:00 jacob_007

Go语言项目的错误和异常管理

最近连续遇到朋友问我项目里错误和异常管理的事情,之前也多次跟团队强调过错误和异常管理的一些概念,所以趁今天有动力就赶紧写一篇Go语言项目错误和异常管理的经验分享。 首先我们要理清:什么是错误、什么是异常、为什么需要管理。然后才是怎样管理。 错误和异常从语言机制上面讲,就是error和panic的区别,放到别的语言也一样,别的语言没有error类型,但是有错误码之类的,没有panic,但是有throw之类的。 在语言层面它们是两种概念,导致的是两种不同的结果。如果程序遇到错误不处理,那么可能进一步的产生业务上的错误,比如给用户多扣钱了,或者进一步产生了异常;如果程序遇到异常不处理,那么结果就是进程异常退出。 在项目里面是不是应该处理所有的错误情况和捕捉所有的异常呢?我只能说,你可以这么做,但是...阅读全文

博文 2015-03-12 09:40:25 达达

GoLang之错误处理

错误处理 error Go语言引入了一个错误处理的标准模式,即error接口,该接口定义如下: type error interface { Error() string } 对于大多数函数,如果要返回错误,可以将error作为多返回值的最后一个: func foo(param int)(ret int, err error) { ... } 调用时的代码: n, err := foo(0) if err != nil { // 错误处理 } else { // 使用返回值n } 我们还可以自定义错误类型,一个例子: package main import "fmt" import "errors" //自定义的出错结构 type myError struct { arg int errMs...阅读全文

博文 2017-11-24 16:00:00 chenny7

golang学习的点点滴滴:读写文件(面向过程版)

package main import ( "fmt" "bufio" "io" "os" "flag" "strconv" ) // 使用命令行 -in 默认为infile var in *string = flag.String("in", "infile", "input file name ...") var out *string = flag.String("out", "outfile", "output file name ...") func main() { // 解析命令行 flag.Parse() defer func() { // 如果发现异常... if ex := recover();nil!=ex { fmt.Println(ex) } }() value, ...阅读全文

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

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的异常处理 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-11-10 11:00:02 kjfcpua

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 结构体

一、结构体声明和初始化: /*声明结构体*/ type person struct { name string age int } /*初始化结构体,并赋给变量 per*/ per := person {name : "eagle", age : 24} 二、匿名结构体声明和初始化 per := struct { name string age int }{ name : "eagle", age : 24, } /*备注: (1) 匿名结构体的初始化和声明必须合并,不能拆分开 (2) 这里的最后一个逗号(,)必须要有,否则会报错 */ 三、结构体匿名成员声明和初始化 /*声明结构体*/ type person struct{ string int } /*初始化结构体,并赋给变量 per*...阅读全文

博文 2017-01-10 12:00:08 吃一堑消化不良

Go_log

晚上闲着看了眼log 为了学习记录一下 const ( // Bits or'ed together to control what's printed. There is no control over the // order they appear (the order listed here) or the format they present (as // described in the comments). A colon appears after these items: // 2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message Ldate = 1 << iota // the date: 2009/01/23 Ltime...阅读全文

博文 2015-06-18 09:09:05 u012807459

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 亓斌哥哥

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

map当中bool真的值得优化成struct{}{}吗?

首先抛出一个问题,在Go中当我们想实现一个集合的时候,可以用map来实现.而map本身就可以通过”comma ok”机制来获取该建是否存在,例如_ , ok := map["key"],如果没有对应的值,ok为false,以此就可以实现集合.有时候我们会选择map[string]bool这类方式来定义这个集合,但是因为有了”comma ok”这个语法,还可以定义成map[string]struct{}的形式,值不再占用内存. 后者可以表示两种状态有或者无,而前者其实有三种状态,有的时候表示true或者false,或者没有.很多时候我们会选择map[string]struct{}来表示集合的实现,但是这样真得值得么? 这里要从map的实现说起.map的实现是一个hash表.表结构由两个结构体表...阅读全文

博文 2016-04-12 10:32:10 yueyue.gao

编写优雅代码的实现步骤

  1.消除硬编码   第一个就是它有硬编码的情况,什么是硬编码,什么是硬编码就是说在代码里面,你用的一些变量它是写死的,比如说我们刚才调用connect APId的时候它的,ip地址端口用户名和密码都是我们写死的,什么192.168.3.106,用户名,密码,如果它的对端的这个端口它变了,或者说是密码用户名一般不会变。它的密码改变我们是不是要去修改代码,如果在实际工作中这样是非常不方便的,而且是有一定风险的,修改代码就意味着它可能是bug产生的边缘。所以说我们最好把这个可配置的代码,和变量分离开来。就是说消除硬编码的一个办法就是让它可配置。   2.异常捕捉   其次就是异常的捕捉,我们可以看到刚开始我们想列了,那个设置hot key机制时候,它调用connect方法,就...阅读全文

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

Paramiko中上传远程文件方法步骤详解

  本文和大家分享的主要是paramiko中上传文件的方法及步骤,希望通过本文的分享,对大家学习和使用paramiko有所帮助。   机器件文件传输   一般选择SCP或者SFTP   SCP   SCP全写是:Secure Copy,是基于SSH协议的文件拷贝方法,可以在本机与远程主机或两个远程主机之间进行文件拷贝。SCP的实现需要通过SCP协议以及SCP程序。   使用:scp localfile usr@host:dir   SFTP   在计算机领域,SSH文件传输协议 (英语:SSH File Transfer Protocol,也称 Secret File Transfer Protocol,Secure FTP或SFTP) 是一数据流连...阅读全文

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

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

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的异常处理 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

Go deep into equals方法

深入equals方法 equals方法的重要性毋须多言,只要你想比较的两个对象不愿是同一对象,你就应该实现equals方法,让对象用你认为相等的条件来进行比较. 下面的内容只是API的规范,没有什么太高深的意义,但我之所以最先把它列在这儿,是因为这些规范在事实中并不是真正能保证得到实现. 1.对于任何引用类型, o.equals(o) == true成立.2.如果 o.equals(o1) == true 成立,那么o1.equals(o)==true也一定要成立.3.如果 o.equals(o1) == true 成立且 o.equals(o2) == true 成立,那么o1.equals(o2) == true 也成立.4.如果第一次调用o.equals(o1) == true成立再o...阅读全文

博文 2016-04-11 02:00:10 napolar

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文件操作

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内存分配

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函数,这个函数三个参数,第一个参数是对象类型大小,第二个参数是对象类型,第三个参数是malloc的标志位,这个标志位有两位,一个标志位代表GC不需要扫描这个对象,另一个标志位说明这个对象并不是空内存 cons...阅读全文

博文 2016-01-22 03:00:00 yjf512

Go的类型断言解析

经常地我们对一个接口值的动态类型是不确定的,如方法的形参为接口类型时,此时就需要检验它是否符合我们需要的类型。类型断言是一个使用在接口值上的操作。 如果对Golang的接口和接口值的概念不熟悉,看这里:Go的接口总结断言类型的语法:x.(T),这里x表示一个接口的类型,T表示一个类型(也可为接口类型)。一个类型断言检查一个接口对象x的动态类型是否和断言的类型T匹配。 类型断言分两种情况:第一种,如果断言的类型T是一个具体类型,类型断言x.(T)就检查x的动态类型是否和T的类型相同。 如果这个检查成功了,类型断言的结果是一个类型为T的对象,该对象的值为接口变量x的动态值。换句话说,具体类型的类型断言从它的操作对象中获得具体的值。 如果检查失败,接下来这个操作会抛出panic,除非用两个变量来接...阅读全文

博文 2017-10-20 08:06:27 susufufu

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

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异常处理

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 醉人的笑容你有没有