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

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

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

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

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

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语言 常用日志记录方法

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

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

微信支付官方 sdk for golang

# wxpay for golang 注:本人照着微信支付官方 SDK Java 版,用 Go 语言实现的一个微信支付 SDK,与 Java 版功能一致,具备轻量易上手,且功能齐全的特点,理论上性能也会比 Java 版的更快。 Github地址:[wxpay](https://github.com/objcoding/wxpay) ## 微信支付开发文档API 对[微信支付开发者文档](https://pay.weixin.qq.com/wiki/doc/api/index.html)中给出的API进行了封装。 wxpay提供了对应的方法: | 方法名 | 说明 | | ---------------- | ----------- | | MicroPay | 刷卡支付 | | Unifie...阅读全文

博文 2018-08-20 00:48:03 zhangchenghuidev

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之错误处理

错误处理 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的map并发安全

已知多个goroutine同时读写Map会出问题 如下代码会抛出异常 package main import ( "time" "fmt" ) func main() { c := make(map[string]int) go func() {//开一个goroutine写map for j := 0; j < 1000000; j++ { c[fmt.Sprintf("%d", j)] = j } }() go func() { //开一个goroutine读map for j := 0; j < 1000000; j++ { fmt.Println(c[fmt.Sprintf("%d",j)]) } }() time.Sleep(time.Second*20) } 运行结果 fatal...阅读全文

博文 2019-05-03 07:34:38 星落纷纷

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

golang捕获异常

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

博文 2017-03-01 08:16:05 吴之恒心

Golang 语言基础之四: map, range

Golang 语言基础之四: map, range Golang 语言基础系列: Golang 语言基础之一: type, variable, constant Golang 语言基础之二: for, ifelse, switch Golang 语言基础之三: array, slice Golang 语言基础之四: map, range Golang 语言基础之五: function Golang 语言基础之六: string, pointer Golang 语言基础之七: struct, method Golang 语言基础之八: interface Golang 语言基础之九: error, panic, recover Golang 语言基础之十: goroutine, channel...阅读全文

博文 2017-02-10 13:39:41 Xiaohui Wang

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

关于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的类型断言解析

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

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

Go 中 Queue 的实现方式

需求队列的特性较为单一,基本操作即初始化、获取大小、添加元素、移除元素等。最重要的特性就是满足先进先出。实现接下来还是按照以前的套路,一步一步来分析如何利用Go的语法特性实现Queue这种数据结构。定义首先定义每个节点Node结构体,照例Value的值类型可以是任意类型,节点的前后指针域指针类型为nodetype node struct { value interface{} prev *node next *node } 继续定义链表结构,定义出头结点和尾节点的指针,同时定义队列大小size:type LinkedQueue struct { head *node tail *node size int } 大小获取队列大小,只需要获取LinkedQueue中的size大小即可:func ...阅读全文

博文 2017-09-27 03:29:26 allenwu.itscoder.com

Golang中的Interface(接口)

Go语言中的interface没有强制要求实现方法,但是interface是go中非常强大的工具之一。任一类型都可以实现interface中的方法,interface中的值可以代表是各种类型的值,这就是Go中实现多态的基础 什么是接口 interface就是字面意思——接口,C++中可以用虚基类表示;Java中就是interface。 我们之前在结构体和方法的博文中提到了很多有关于对象和属性的知识点。而interface则使Golang更接近面向对象编程范式的另一个难点 interface是方法签名的一个集合,这些方法可以被任一类型通过方法实现。因此接口就是对象行为的申明(不是定义,仅仅表示方法签名,也可以称作函数原型)。 ????注意:我多次强调 任一类型 ,Golang中所有类型都可以实...阅读全文

博文 2020-03-27 01:32:55 EriolSoong

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 - 以任意类型的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

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

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) 是一数据流连...阅读全文

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

Go 中的复合字面量

![](https://raw.githubusercontent.com/studygolang/gctt-images/master/composite-literal/1_TM61VTlvvL2YWtI6UUYLOg.png) 在源代码中字面量可以描述像数字,字符串,布尔等类型的固定值。Go 和 JavaScript、Python 语言一样,即便是复合类型(数组,字典,切片,结构体)也允许使用字面量。Golang 的复合字面量表达也很方便、简洁,使用单一语法即可实现。在 JavaScript 中它是这样的: ```javascript var numbers = [1, 2, 3, 4] var thing = {name: "Raspberry Pi", generatio...阅读全文

博文 2018-05-08 22:11:54 yiyulantian

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

golang中defer,panic,recover是很常用的三个特性,三者一起使用可以充当其他语言中try…catch…的角色,而defer本身又像其他语言的析构函数 defer 在函数返回之前调用,用于资源释放、打印日志、异常捕获等 f, err := os.Open(filename) if err != nil { return err } /** * 这里defer要写在err判断的后边而不是os.Open后边 * 如果资源没有获取成功,就没有必要对资源执行释放操作 * 如果err不为nil而执行资源执行释放操作,有可能导致panic */ defer f.Close() 如果有多个defer表达式,调用顺序类似于栈,越后面的defer表达式越先被调用(后进先出) func mai...阅读全文

博文 2018-10-25 10:34:44 smoke_zl

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

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

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

微信支付 SDK for Golang

一个为Go语言量身定做、超级好用的微信支付SDK。 GitHub地址:wxpay 微信支付开发文档API 对微信支付开发者文档中给出的API进行了封装。 wxpay提供了对应的方法: | 方法名 | 说明 | | ---------------- | ----------- | | MicroPay | 刷卡支付 | | UnifiedOrder | 统一下单 | | OrderQuery | 查询订单 | | Reverse | 撤销订单 | | CloseOrder | 关闭订单 | | Refund | 申请退款 | | RefundQuery | 查询退款 | | DownloadBill | 下载对账单 | | Report | 交易保障 | | ShortUrl | 转换短链接 ...阅读全文

博文 2018-08-22 00:35:04 objcoding

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

golang日志log

1、log简介 golang内置了log包,实现简单的日志服务。通过调用log包的函数,可以实现简单的日志打印功能。 2、log使用 log包中有3个系列的日志打印函数,分别print系列、panic系列、fatal系列。 函数系列 作用 print 单纯打印日志 panic 打印日志,抛出panic异常 fatal 打印日志,强制结束程序(os.Exit(1)),defer函数不会执行 2.1 简单示例 func main() { defer fmt.Println("panic退出前处理") log.Println("println日志") log.Panic("panic日志") log.Fatal("程序退出日志") } 结果示例(实际结果不是这样的哦,因为panic,fatal会影...阅读全文

博文 2020-06-02 17:32:52 一如既往wfqwfq

关于 Go 中的 panic 的使用以及误用

Go 采用明确的 error 值和类似异常的 panic 机制的方式作为独有的错误处理机制。在文章中将聚焦于 panic 的设计哲学。尝试去理解来自 Go 团队的冲突 首先,这是一个关于语言设计实用性方面的故事,并对实用主义优缺点做了一些思考。 ## 介绍 错误和异常 (errors and exceptions) 大多数编程语言支持 exception 作为处理 error 的标准方式,比如 Java,Python。虽然方便,但也会带来许多问题,这就是为什么他们不喜欢其他语言或者风格。对 exception 的主要吐槽点是它们为控制流引入了 "side channel",当阅读代码的时候,你必须时刻记住这个 exception 引发的流程控制方向。这也导致某些代码阅读起来比较困难[1]。 ...阅读全文

博文 2018-11-16 09:51:28 polaris

编写优雅代码的实现步骤

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

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

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 吃一堑消化不良

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

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

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

Go1.10.1在Idea上能编译 , 但是标红 ..

![image.png](https://static.studygolang.com/180426/c222ef360501d6fc90394d62684836b7.png) 有种淡淡的忧伤 ~~ 有遇到这种这种情况的小伙伴么?? 有啥办法解决这种不兼容的情况么?? 各种查看Idea这货直接抛出一个警告(不知道是不是这个原因): ![image.png](https://static.studygolang.com/180426/2b5c915a97cc853d9d823bc63dac3a3e.png...阅读全文

博文 2018-04-26 16:55:26 LFANG

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

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

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

学习python哪个版本好用?python开发学习

想学习Python的人都会有一个困惑,那就是Python目前有两个版本Python2和Python3,Python2与Python3有何区别,两个版本该学习哪个呢? python3 和 python2 是不兼容的,而且差异比较大,python3是不向下兼容的,但是绝大多数组件和扩展都是基于python2的。目前实际应用中大部分暂不考虑 Python3,有的时候注意写兼容 2/3 的代码。用 Python2 为主的写新代码时要考虑以后迁移到 Python3 的可能性。据数据统计显示目前10% 使用 Python 3;20% 既使用Python 2也使用Python 3,Python 2用的更多;70% 使用Python 2。 其实python是linux上最常用的软件之一,但是li...阅读全文

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 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 语言中提取字段和方法

struct 是一系列包含名称和类型的字段。通常就像这样: ```go package main import "fmt" type Person struct { name string age int32 } func main() { person := Person{name: "Michał", age: 29} fmt.Println(person) // {Michał 29} } ``` (在这篇博文的接下来部分,我将逐步删除包名、导入和主函数的定义) 上面的结构体中,每个字段都有明确的名字。Go 语言也允许不指定字段名称。没有名称的字段称为匿名字段或者内嵌字段。类型的名字(如果有包名,不包含这个前缀的包名)就作为字段的名字。因为结构体中要求至少有一个唯一的字段名,所以我们不...阅读全文

博文 2018-04-14 00:00:17 gogeof

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

Go 中 BST 的实现方式

本篇文章为A Binary Search Tree的核心内容翻译,仅做个人学习之用。原文在文章开头花了不少篇幅介绍查找、二叉树相关内容,本译文假定你具备一定的计算机基础,就不做过多介绍了。Import and globals在构建BST的结构时候,需要导入以下包,作用都很简单分别是提示Error,打印以及Log相关内容:package main import ( "errors" "fmt" "log" ) A Tree Node按照之前的定义,一个树节点需要包含节点数值、左孩子节点、右孩子节点。树就是一种递归的数据结构,孩子节点也同样具备上述特性。在这个小实例中,每个树节点还包含一个简单的string值域。所以Node节点的定义如下所示:type Node struct { Value s...阅读全文

博文 2017-09-27 03:06:43 allenwu.itscoder.com

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