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

Go的Defer、Panic和Recover (翻译)

dont-panic.png 翻译自:https://blog.golang.org/defer-panic-and-recover Go有和语言一样常见的流程控制语句:if, for, switch, goto。同时也可以使用go语句实现在不同的goroutine中运行代码(并发)。不过,今天我们将来讨论一些少见的话题:defer、panic和recover。 Defer defer语句会将函数推入到一个列表中。同时,列表中的函数会在return语句执行后被调用。defer常常会被用来简化资源清理释放之类的操作。 举个例子,我们来观察下下面这个函数,它的主要功能是打开两个文件并将一个文件的内容拷贝到另一个文件: func CopyFile(dstName, srcName string) ...阅读全文

博文 2019-02-24 19:34:42 波罗学

go语言渐入佳境[10]-function

无参函数123func printstring(){ fmt.Println("hello jonson")}带参函数123func add(a,b int){ fmt.Println("a+b=",a+b)}返回值123func addres(a,b int) int{ return a+b}有名字的返回值1234func addresname(a,b int)(sum int){ sum = a+b return}多返回值123456func addmuti(a,b int)(int,int){ add := a+b mul:= a*b return add,mul}不定个数参数1234567func addsum(nums ... int) int{ var sum int for _...阅读全文

博文 2018-12-04 23:35:17 jonson_jackson

Go语言开发(七)、Go语言错误处理

Go语言开发(七)、Go语言错误处理 一、defer延迟函数 1、defer延迟函数简介 defer在声明时不会立即执行,而是在函数return后,再按照FILO(先进后出)的原则依次执行每一个defer,一般用于异常处理、释放资源、清理数据、记录日志等。每次defer语句执行时,defer修饰的函数的返回值和参数取值会照常进行计算和保存,但是defer修饰的函数不会执行。等到上一级函数返回前,会按照defer的声明顺序倒序执行全部defer的函数。defer所修饰函数的任何返回值都会被丢弃。如果一个defer所修饰函数的值为nil,则defer的函数会在函数执行时panic(异常),而不会在defer语句执行时panic。defer所修饰函数的上一级函数即使抛出异常,defer所修饰函数也...阅读全文

博文 2018-07-02 21:35:14 天山老妖S

golang关于defer的问题

要弄明白defer首先得搞清楚闭包和局部作用域。 闭包 闭包是匿名函数与匿名函数所引用环境的组合。 看一个例子: func main() { n := 0 f := func() { n += 1 } f() fmt.Println("n = ", n) } // output: n = 1 func main() { n := 0 f := func(n int) { n += 1 } f(n) fmt.Println("n = ", n) } // output n = 0 看了以上两个例子,大概可以对闭包有个简单的认识,匿名函数可以直接引用上一级函数内的变量, 所以可以看到第一个例子进行 n+1 操作修改了main函数中的n的值。 而第二个函数中的匿名函数需要传参n, 因为go中的传参...阅读全文

博文 2019-06-27 21:02:38 五知小白羊

【Golang 基础】Go 语言的切片

Go 语言的切片(示例代码) Slice 是一个通过指向数组底层,来进行变长数组的实现。 定义切片的格式:var []; package basic import "fmt" func DeclaratSlice(){ // 定义一个空 slice var slice1 []int fmt.Println(slice1) // [] // 定义一个 slice 并赋初始值 slice2 := []int{ 1, 3, 4 } fmt.Println(slice2) // [1 3 4] } 通过 make([], len, cap) 格式来创建 slice。其中,len 表示 slice 的长度,cap 表示 slice 的容量;cap 的值默...阅读全文

博文 2019-03-27 02:34:38 爱写作的程序猿

Golang学习笔记-反射

反射让我们可以在运行时获取对象的类型信息,比如查看一个结构体有多少字段,查看函数的入参类型和返回值类型等。 Go提供了reflect.TypeOf()和reflect.ValueOf获取任意对象的reflect.Value和reflect.Type,其中reflect.Type是一个接口类型,该接口提供了很多方法让我们获取类型信息,而reflect.Value是一个结构体,它提供了很多方法让我们获取或者写入reflect.Value结构体中存储的数据。 获取类型信息 package main import ( "fmt" "reflect" ) type Person struct { name string height int } func (person Person) AddHeig...阅读全文

博文 2019-12-19 07:32:42 土豆吞噬者

Go基础系列:函数(1)

Go中函数特性简介 对Go中的函数特性做一个总结。懂则看,不懂则算。 Go中有3种函数:普通函数、匿名函数(没有名称的函数)、方法(定义在struct上的函数)。 Go编译时不在乎函数的定义位置,但建议init()定义在最前面(如果有的话),main函数定义在init()之后,然后再根据函数名的字母顺序或者根据调用顺序放置各函数的位置。 函数的参数、返回值以及它们的类型,结合起来成为函数的签名(signature)。 函数调用的时候,如果有参数传递给函数,则先拷贝参数的副本,再将副本传递给函数。 由于引用类型(slice、map、interface、channel)自身就是指针,所以这些类型的值拷贝给函数参数,函数内部的参数仍然指向它们的底层数据结构。 函数参数可以没有名称,例如func m...阅读全文

博文 2018-11-23 09:10:55 f-ck-need-u

GO中defer关键字

defer关键字在go中用于return之前执行,在golang官方文档中有说明。defer的用法类似java中的finally语句块,一般用于释放已分配的资源。 见如下例子: package main import ( "io" "log" ) func run(s string) (n int, err error) { defer func() { log.Printf("run(%q) = %d, %v", s, n, err) }() return 7, io.EOF } func main() { run("Go") } 输出结果: 2019/01/31 15:13:21 run("Go") = 7, EOF 那么这个结果该如何理解呢?要使用defer时不踩坑,最重要的一点就是要...阅读全文

博文 2019-01-31 16:34:43 E度丶塔罗

golang 基础

JUST笔记 Go语言主要特性 自动垃圾回收(Python: so easy?) 丰富内置类型(Python: I don't think so) 函数多返回值(Python: I can) 错误处理(Python:are you sure?) 匿名函数和闭包(Python: give me something new?) 类型和接口(Python: Not bad!) 并发编程(Python: Yes, double click & 666) 反射(I do not use and I do not know) 语言交互性(Python: Now, I just found I like you) Let's say "Hello World!" package main // you k...阅读全文

博文 2019-08-28 11:32:46 JM68

go语言中那样让你吃惊的东西

本文面向golang的新手,第一次接触golang时可能会吃惊的地方 1. 以大小写开头来决定一个声明是包内可见,还是包外可见 如果一个常量/变量/类型/函数 它的名称是小写字母开头,则它是一个内部的,只能在同一个包内访问。 反之它是导出到外部的。 ~/go/src/a.go package a import “b” var name = b.lower // error var name = b.Upper // correct ~/go/src/b.go package b const lower = “lower” const Upper = “Upper” 2. 函数支持多返回值。 resp, err := http.Get(url) 对于那些将运行失败看作是预期结果的函数,它们会返...阅读全文

博文 2020-02-23 23:32:45 林晨chris

Go学习笔记(五)

I/O小练习 package main import ( "fmt" "os" "reflect" ) // 定义一个Data结构体 type Data struct { } // 声明Data结构体的成员函数String() func (self Data) String() string { return "data" } func main() { fmt.Println("Hello World!") // 格式化浮点数(转换成字符串) str := fmt.Sprintf("%f", 3.14159) fmt.Println(reflect.TypeOf(str)) fmt.Println(str) // 向屏幕输出"A\n" fmt.Fprint(os.Stdout, "A\n"...阅读全文

博文 2019-08-07 15:32:46 _sign

defer 链表如何被遍历执行

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

博文 2020-05-02 18:57:22 qcrao

GO的第八天,函数多返回值

多返回值 在Go中,一个函数可以返回多个值,这和其他编程语言有很大的不同。对于我们这些有编程经验的人来说,学习这个特性不难,而是很难想到去使用这个特性。 举个简单的例子: package main import "fmt" func swap(a int, b int) (int, int){ return b, a } func main() { a := 1 b := 2 a, b = swap(a, b) fmt.Println(a, b) } 上面这个简单的交换两个数值的例子,可以简单的理解多返回值。 还有一种多返回值的写法,就是函数将所有的返回值都显示定义,那么该函数的return语句可以省略操作数。这种我们称之为 bare return。 func swap(a int, b i...阅读全文

golang panic堆栈日志解读

问题由来 以前出现panic问题,总是习惯通过日志中给出的代码行,去“猜测”是哪个变量出了问题, 如果推断不出来,就多加入一些日志,重现panic,再继续定位。 昨天又遇到了panic的问题,看到屏幕上打印了很多堆栈日志,转念一想: 如果现网出现了panic但日志信息不够怎么办,总不能先加日志等下次重现后再定位吧? 然后尝试仔细阅读堆栈日志时,却多出了一些疑惑: 为什么定义是: func Fun1(slice []string, t *Test, i int) 但堆栈日志显示: main.Fun1(0xc000078f48, 0x2, 0x4, 0x0, 0x7) /Users/leidingyu/workspace/go_proj/src/git.code.oa.com/SNG_EDU_G...阅读全文

博文 2020-01-11 21:32:42 竹一先生_阳明学子

golang-测试方式

package main import ( "fmt" "testing" ) // 在项目的api目录下有个 main_test.go 文件,那么就可以在这个目录下面执行 go test 命令来执行 // go test -v 可以看出执行了哪几个函数 // test文件下的文件名, 必须是这种类型, 比如: main_test.go // test文件下的每一个文件test case均必须义Test开头并且符合TestXxx形式,否则go test会直接跳过测试不执行 func TestPrint(t *testing.T){ // 表示跳过当前测试 // t.SkipNow() res := print20() if res != 210 { t.Errorf("返回值错误!") } ...阅读全文

博文 2019-12-18 12:32:42 爱吃豆包

Go的Defer、Panic和Recover (翻译)

翻译自:https://blog.golang.org/defer-panic-and-recover Go有和语言一样常见的流程控制语句:if, for, switch, goto。同时也可以使用go语句实现在不同的goroutine中运行代码(并发)。不过,今天我们将来讨论一些少见的话题:defer、panic和recover。 Defer defer语句会将函数推入到一个列表中。同时,列表中的函数会在return语句执行后被调用。defer常常会被用来简化资源清理释放之类的操作。 举个例子,我们来观察下下面这个函数,它的主要功能是打开两个文件并将一个文件的内容拷贝到另一个文件: func CopyFile(dstName, srcName string) (written int64,...阅读全文

博文 2019-02-24 17:34:42 波罗学

Go语言从入门到精通-02 | 函数和控制语句

请从github下载配套代码: https://github.com/shuningzhang/learn_golang 前文的内容都是一大坨堆到那的,看上去很难看。下面我们介绍一下如何通过函数对代码进行封装,同时会介绍如何通过控制语句改变程序执行的流程。 没有用的封面 函数 比如我们要实现某个功能,举个简答的例子,实现一个整数加法的功能。实现起来很简单,代码大概如下: var add_1, add_2, add_3 int32 add_1 = 15 add_2 = 16 add_3 = add_1 + add_2 如果我们要在其它地方用这个功能呢?没别的办法,只能讲这个代码重新写一遍。如果用的地方很多,那就要写很多遍。这个时候函数出场了,函数是做什么的呢?它可以将一段功能代码封装起来,通过...阅读全文

博文 2019-03-18 22:34:42 萨泥君

Golang的函数

前言 做开发快二年时间了,但是一般博客发布都在博客园,但是发现简书不能空,所以记录点什么吧,那么就从Golang开始吧。。。。。 Golang函数 //go语言函数和我们大部分语言函数是相同的,但是也有其不同点 //1.定义方法(为什么要用函数,目的的重用代码) func 函数名(参数列表){ //执行的业务逻辑 fmt.Pringln("hello world") } //2.函数的参数(函数参数和js有点相似) func sum(num1 int,num2 int){ fmt.Println(num1,num2) } //3.函数的参数(不定长传参数) func sum1(args ... int){ //这里的args可以任意名字,其字符的类型是切片,所以可以通过for循环获取每一个值...阅读全文

博文 2019-06-13 15:02:54 江世文

Golang map

前些天看了DAVE CHENEY大神的直播。里面讲到了go的map实现。做个笔记 (我用的是go1.13 貌似大神直播时候用的是还没发布的1.15 所以本文中的代码都是1.13中的。与1.15略有差异) compile time rewriting: 左边对map的操作实际上被编译成了右边的调用 v := m["key"] -> runtime.mapaccess1(m, "key", &v) v, ok := m["key"] -> runtime.mapaccess2(m, "key", &v, &ok) m["key"] = 9001 -> runtime.mapinsert(m, "key", 9001) delete(m, "key") -> runtime.mapdelete(m...阅读全文

博文 2020-05-12 11:35:48 郭老汉

【Golang 基础】Go 语言的 Map

Go 语言中的Map   Map 是一个无序的键值对数据集合,通过 key 快速检索数据。 通过 map[keyType]valueType 格式声明 Map; package basic import "fmt" func DeclaratMap(){ // 声明一个空的 map m1 := map[int]string{} fmt.Println(m1) // map[] // 声明一个 map 并赋初始值 m2 := map[int]string{ 0: "Java", 1: "C#", 2: "Python", 3: "Golang" } fmt.Println(m2) // map[3:Golang 0:Java 1:C# 2:Python] } 通过 make(map[keyTy...阅读全文

博文 2019-03-28 02:34:38 爱写作的程序猿

Go的接口

有意思的接口规则:自动实现 Go语言也支持接口,但是它的接口规则很有意思: 一个struct不需要显示声明它要实现的接口,只要实现了接口中规定的所有方法,那么就自动实现了相应的接口了。 所以正常情况下,如果有如下一个struct type A struct { } func (*A) func Foo() {} func (*A) func Bar(i int) int { return i } 那么它就自动同时实现了下面三个接口 type IFoo interface { Foo() } type IBar interface { Bar(i int) int } type IFooBar interface { IFoo IBar } 所以我们可以进行如下的赋值: var a *A = ...阅读全文

博文 2019-07-10 03:32:40 千寻客

13. Maps

13. Maps 什么是 map ? map 是在 Go 中将值(value)与键(key)关联的内置类型。通过相应的键可以获取到值。 如何创建 map ? 通过向 make 函数传入键和值的类型,可以创建 map。make(map[type of key]type of value) 是创建 map 的语法。 personSalary := make(map[string]int) 上面的代码创建了一个名为 personSalary 的 map,其中键是 string 类型,而值是 int 类型。 map 的零值是 nil。如果你想添加元素到 nil map 中,会触发运行时 panic。因此 map 必须使用 make 函数初始化。 package main import ( "fmt"...阅读全文

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

Go入门系列(六)I/O

目录: 一、终端I/O 二、文件I/O 一、终端I/O Go语言的终端I/O操作在基础包上有封装了多种,我们以fmt包为例: 如果为单次输入,可使用Scanln,如一次输入多个变量,可使用Scanf。 func main() { var name string var age int fmt.Print("请输入姓名:") _, _ = fmt.Scanln(&name) fmt.Print("请输入年龄:") _, _ = fmt.Scanln(&age) fmt.Printf("您的姓名为:%s,您的年龄为:%d",name,age) } #输出 请输入姓名:rabbit 请输入年龄:18 您的姓名为:rabbit,您的年龄为:18 大家可能注意到与网上常见的教程不一样,这里使用了两个忽...阅读全文

博文 2020-03-17 05:32:50 RabbitMask

Go随笔——函数的用法

定义函数包含函数名,行参列表,函数体和返回值列表,使用func进行声明,函数无参数或返回值时则形参列表和返回值列表省略func name(parameters) returns { }形参列表需要描述参数名及参数类型,所有形参为函数块局部变量,返回值需要描述返回值类型举例 1.无参 无返回值 func sayHello() { fmt.Println("hello world") } 2.有参 无返回值 func say(name string, name2 string) { fmt.Println("hello world:", name, name2) } 3.有参 有返回值 func add (a int, b int) int { return a + b } func main(...阅读全文

博文 2020-05-25 09:33:16 wujunqi1996

GoLang 学习笔记 - 函数(Function)

函数是基本的代码块,用于实现一个特定功能(Go 程序中必须要有一个 main() 函数)。   你可以通过函数来划分不同功能,逻辑上每个函数只执行指定的任务。函数声明会告诉 Go 编译器函数的名称,返回类型,和参数。   GoLang 标准库提供了多种可直接调用的内置函数。例如,len() 函数可以接受不同类型参数并返回该类型的长度,如果我们传入的是字符串则返回字符串的长度,如果传入的是数组,则返回数组中包含的元素个数。 函数定义   GoLang 语言函数定义格式如下: func function_name( [parameter list] ) [return_types] { // 函数体 } 函数定义解析: func:函数声明语句 function_name:函数名称,函数名和参数列...阅读全文

博文 2019-07-22 19:32:42 凉丶心园

go基础系列:简介

1.Go简介 Go语言是编译型、静态类型的类C的语言,并带有GC(垃圾收集器,garbage collection)。这意味着什么? 另外,Go是一种非常严格的语言,它几乎总是要求我们"以标准答案去答题",在其它语言可以容忍的不规范编码方式在Go语言中几乎都会抛异常。例如导入了包却没有使用这个包,Go不会去编译它并报错。再例如,定义了一个变量但从来没用过,也会报错。 初学Go的时候,这可能是件无比的苦恼事情,但习惯了之后,编写出来的程序自然是无比规范的。这也正是Go和不少语言的区别:其它语言编码、调试阶段可能很快,但维护和优化阶段可能会非常长;而Go的编码周期可能稍长,但编码完成后几乎都是足够优化的,维护和优化周期足够短。 编译型 编译表示的是将你所写的源代码转换为低层次的语言,例如汇编语言...阅读全文

博文 2018-11-23 09:06:24 f-ck-need-u

golang[32]-区块链-base58

base58Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+“和”/"符号。设计Base58主要的目的是:避免混淆。在某些字体下,数字0和字母大写O,以及字母大写I和字母小写l会非常相似。不使用"+“和”/"的原因是非字母或数字的字符串作为帐号较难被接受。没有标点符号,通常不会被从中间分行。大部分的软件支持双击选择整个字符串。base58编码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545...阅读全文

博文 2019-02-21 15:35:52 jonson_jackson

Go 每日一库之 validator

简介 今天我们来介绍一个非常实用的库——validator。validator用于对数据进行校验。在 Web 开发中,对用户传过来的数据我们都需要进行严格校验,防止用户的恶意请求。例如日期格式,用户年龄,性别等必须是正常的值,不能随意设置。 快速使用 先安装: $ go get gopkg.in/go-playground/validator.v10 复制代码后使用: package main import ( "fmt" "gopkg.in/go-playground/validator.v10" ) type User struct { Name string `validate:"min=6,max=10"` Age int `validate:"min=1,max=100"` } f...阅读全文

博文 2020-04-06 00:34:22 darjun

Go语言学习笔记03--流程控制循环语句与函数

1.三目运算符 特别注意!在go语言中不存在三目运算符这个东西! 不是不推荐使用,就是完全不存在! 2.循环结构 go语言中有且仅有一种循环结构,就是for循环结构。不存在while或者dowhile这样的循环结构。 for 表达式1;表达式2;表达式3{ 循环体 } 循环的结构与标识符含义几乎与传统c语言相同。 (1)表达式1:循环变量赋初值 (2)表达式2:循环能够继续的循环条件 (3)表达式3:循环变量向着循环结束的方向变化 eg: for num:=0; num<10; num++{ fmt.Println(num); } 注意:go语言中的变量作用域为块级作用域,而不是函数级作用域! 因此定义在for循环内部的变量,其作用域仅能够在for循环内部生效, 因此它们在for循环之外是不...阅读全文

博文 2018-11-30 17:02:11 FrankAdd

Blog.1 database.sql.driver

在事务操作中,要求事务的各个阶段都使用一个Conn连接。在连接被关闭之前,还需要执行rollback操作。 文章翻译了Go源码下database.sql.driver的接口规范,具体实现可以查看源码。 // 包driver定义了数据驱动要实现的接口,具体的实现会在包sql中用到。 // // 更多还是使用包sql中的代码 package driver import ( "context" "errors" "reflect" ) // Value必须是一个驱动可以处理的值、NamedValueChecker接口能够处理的类型 // 或者下面这些类型的实例 // // int64 // float64 // bool // []byte // string // time.Time // //...阅读全文

博文 2019-07-17 23:02:41 渐行渐远

Container - 为 Go语言而生的运行时依赖注入容器

Container 是一款为 Go 语言开发的运行时依赖注入库。Go 语言的语言特性决定了实现一款类型安全的依赖注入容器并不太容易,因此 Container 大量使用了 Go 的反射机制。如果你的使用场景对性能要求并不是那个苛刻,那 Container 非常适合你。 并不是说对性能要求苛刻的环境中就不能使用了,你可以把 Container 作为一个对象依赖管理工具,在你的业务初始化时获取依赖的对象。 使用方式 go get github.com/mylxsw/container 要创建一个 Container 实例,使用 containier.New 方法 cc := container.New() 此时就创建了一个空的容器。 你也可以使用 container.NewWithContext(...阅读全文

博文 2020-05-25 18:32:43 mylxsw

Golang学习笔记-函数

Go函数定义格式如下: func function_name( [parameter list] ) [return_types] { 函数体 } 例如: func add(n1, n2 int) int{ return n1 + n2 } Go函数可以返回多个值,这个时候返回值类型要用括号括起来,例如: func div(n1, n2 int) (int,int){ return n1 / n2, n1 % n2 } Go函数可以给返回值命名,这个时候即使只有一个返回值也要用括号括起来,例如: func add(n1, n2 int) (result int){ result= n1 + n2 return } func div(n1, n2 int) (result int,remain...阅读全文

博文 2019-09-27 23:33:00 aside section ._1OhGeD

golang 基础(9)函数

square-gopher.png 函数 函数是由函数名,参数,返回值和函数体所组成。 func add(a, b int) int {} 定义函数并且复习一下之前的 switch 语句 func eval(a, b int,op string) int { switch op { case "+": return a + b case "-": return a - b case "*": return a * b case "/": return a / b default: panic("unsupported operation: " + op) } } 在 go 语言中 { 需要 bar() 在同一行不言就会报错 func bar() //报错 { } .\funtions.go:...阅读全文

博文 2019-03-17 20:34:42 zidea

golang-101-hacks(18)——map类型访问

Map是一种指向哈希表的引用类型,可以使用map构造一个“键值”类型的数据库,这在实际编程中非常高效。例如,下面的代码是统计切片中每个元素的总数: package main import ( "fmt" ) func main() { s := []int{1, 1, 2, 2, 3, 3, 3} m := make(map[int]int) for _, v := range s { m[v]++ } for key, value := range m { fmt.Printf("%d occurs %d times\n", key, value) } } 运行结果 3 occurs 3 times 1 occurs 2 times 2 occurs 2 times 此外,根据Go spe...阅读全文

博文 2019-06-09 11:02:40 羊羽share

golang语言defer特性详解.md

[TOC] golang语言defer特性详解 defer语句是go语言提供的一种用于注册延迟调用的机制,它可以让函数在当前函数执行完毕后执行,是go语言中一种很有用的特性。由于它使用起来简单又方便,所以深得go语言开发者的欢迎。但是,真正想要使用好这一特性,却得对这一特性深入理解它的原理,不然很容易掉进一些奇怪的坑里还找不到原因。接下来,我们将一起来探讨defer的使用方式,使用场景及一些容易产生误解、混淆的规则。 什么是defer 首先我们来看下defer语句的官方解释 A "defer" statement invokes a function whose execution is deferred to the moment the surrounding function retu...阅读全文

博文 2019-07-12 21:32:43 木鸟飞鱼

Go语言核心之美 4.1-函数声明

函数有以下几个优点:可以把一系列语句打包成一个程序单元;可以把大的工作分解为小的任务,这些任务可以让不同程序员在不同时间、不同地点独立完成;一个函数可以对用户隐藏实现细节。这些优点,让函数变成了程序不可或缺的最重要的部分之一。 在此章之前,我们已经见过很多函数了,现在是时候彻底讨论函数的特性了。本章用的例子是一个网络爬虫,也是web搜索引擎中负责抓取网页的组件,他们会根据抓取到的网页中的链接继续去抓取该链接指向的页面,这个例子可以让我们学习递归函数、匿名函数、错误处理及函数的很多其它特性。 函数声明包含了函数名,可省略的参数列表、返回值列表以及函数体:func name(parameter-list) (result-list) { body } 参数列表描述了参数名和参数类型,这些参数是函...阅读全文

博文 2017-10-27 20:59:22 erlib

7.Go语言基础之函数

1.函数 1.1函数定义 Go语言中定义函数使用fun关键字,具体格式为 func 函数名(参数)(返回值){ 函数体 } 其中: 1.函数名:由字母,数字,下划线组成。但函数名的第一个字母不能是数字。在同一个包内,函数名不能重名。 2.参数:参数由变量名和变量类型组成。 3.返回值:可以只写返回值类型,多个返回值必须用()包裹,并用,分隔。 4.函数体:实现指定功能的代码块。 定义一个求两个数和的函数: func intSum(x int, y int) int { return x + y } 函数的参数和返回值是可选的,我们也可以不传参也没有返回值。 func sayHello() { fmt.Println("Hello vita") } 1.2函数的调用 定义了函数后,可以通过 函...阅读全文

博文 2019-12-12 12:33:10 DevOperater

defer 的一些用法和猜测

以前的代码中,基本上只使用了 defer 作为防御程序 panic 退出的手段,没有仔细考虑过对返回值的影响。今天有同事提到: 如果执行过程中发生 panic,defer函数 recover() != nil的情况下,未命名的返回值的函数会返回什么呢? 之前并没有没有想过这个问题,猜想应该是返回该类型的默认值,试了一下果然如此。 func fooA() float64 { defer func() { if err := recover(); err != nil { } }() *(*float64)(nil) = 0.1 // panic return 1.0 } fooA() 返回0。 那么如果 defer 函数返回值和上层函数一致,会不会替换掉返回值呢?(会就有鬼了) func fo...阅读全文

博文 2019-08-22 02:32:46 SpikeQin

C++服务端面试准备(1)C++相关

声明:本文内容纯属博主自己查找和归纳的个人所需的知识点,仅作参考,如有错误,博主强烈希望您指出。如果您是某个知识点的原创博主,如有需要,可联系本人加上链接。本文内容会根据博主所需进行更新,希望大家多多关照。 面向对象 把数据及对数据的操作方法放在一起,作为一个相互依存的整体 OOP——面向对象的编程,OOD——面向对象的设计,OOA——面向对象的分析 三大特征: 1.封装 将对象的属性和方法封装到一个独立单元中,并且隐藏对象的属性和方法,仅对外提供公共访问方式,将变化隔离,便于使用。 2.继承 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法。继承是多态的前提。 3.多态 多态是面向对象的最后一个主要特征,它本身主要分为两个方面: 方法的多态性:重载与覆写 重载:...阅读全文

博文 2020-04-07 18:32:46 DX3906

defer 的一些用法和猜测

以前的代码中,基本上只使用了 defer 作为防御程序 panic 退出的手段,没有仔细考虑过对返回值的影响。今天有同事提到: 如果执行过程中发生 panic,defer函数 recover() != nil的情况下,未命名的返回值的函数会返回什么呢? 之前并没有没有想过这个问题,猜想应该是返回该类型的默认值,试了一下果然如此。 func fooA() float64 { defer func() { if err := recover(); err != nil { } }() *(*float64)(nil) = 0.1 // panic return 1.0 } fooA() 返回0。 那么如果 defer 函数返回值和上层函数一致,会不会替换掉返回值呢?(会就有鬼了) func fo...阅读全文

博文 2019-09-03 20:32:43 秦川

Golang错误和异常处理的正确姿势

序言 错误和异常是两个不同的概念,非常容易混淆。很多程序员习惯将一切非正常情况都看做错误,而不区分错误和异常,即使程序中可能有异常抛出,也将异常及时捕获并转换成错误。从表面上看,一切皆错误的思路更简单,而异常的引入仅仅增加了额外的复杂度。 但事实并非如此。众所周知,Golang遵循“少即是多”的设计哲学,追求简洁优雅,就是说如果异常价值不大,就不会将异常加入到语言特性中。 错误和异常处理是程序的重要组成部分,我们先看看下面几个问题: 错误和异常如何区分? 错误处理的方式有哪几种? 什么时候需要使用异常终止程序? 什么时候需要捕获异常? ... 如果你对这几个问题的答案不是太清楚,那么就抽一点时间看看本文,或许能给你一些启发。 face-to-exception.png 基础知识 错误指的是可...阅读全文

博文 2018-12-24 18:31:34 u013589865

Golang学习笔记-定时器

Timer 使用time.NewTimer()创建Timer后,经过其指定的时间后,它会向其管道发送当前时间。time.After()也是创建Timer,不过返回值不是Timer而是其管道。 package main import ( "fmt" "sync" "time" ) func main(){ //5秒后将当前时间发送给管道 timer:=time.NewTimer(time.Second*2) if t,ok:=<-timer.C;ok{ fmt.Println(t) } //After()内部调用NewTimer()然后返回其管道 timeChan:=time.After(time.Second*2) if t,ok:=<-timeChan;ok{ fmt.Println(t)...阅读全文

博文 2019-12-27 21:33:09 土豆吞噬者

Golang学习——interface接口学习(二)

Golang接口断言学习 一.类型断言 二.接口断言 1.if else结构 接口断言2.switch结构 接口断言 在Golang中,空接口 interface{}没有定义任何函数,因此Golang 中所有类型都实现了空接口。当一个函数的形参是interface{},那么在函数中,需要对形参进行断言,从而得到它的真实类型。 一.类型断言 在学习接口断言之前,先了解一下类型断言,其实接口断言也是在判断类型。 类型断言,通过它可以做到以下几件事情: 检查 i 是否为 nil检查 i 存储的值是否为某个类型 通常有两种方式: 第一种: t := i.(T) 复制代码 这个表达式可以断言一个接口对象i里不是 nil,并且接口对象i存储的值的类型是 T,如果断言成功,就会返回值给t,如果断言失败,就...阅读全文

博文 2020-05-07 11:36:19 相守之路

在 MaxCompute UDF 中运行 Scipy

摘要: 新版 MaxCompute Isolation Session 支持 Python UDF。也就是说,Python UDF 中已经可以跑二进制包。刚才以 Scipy 为例踩了一下坑,把相关的过程分享出来。 新版 MaxCompute Isolation Session 支持 Python UDF。也就是说,Python UDF 中已经可以跑二进制包。刚才以 Scipy 为例踩了一下坑,把相关的过程分享出来。 下载 Scipy 包并上传资源 首先,从 PyPI 或其他镜像下载 Scipy 包。你需要下载后缀为“cp27-cp27m-manylinux1_x86_64.whl”的包,其他的包会无法加载,包括名为“cp27-cp27mu”的包。以下的截图来自 https://...阅读全文

A Tour of Go: Basics 1

Packages, variables and functions Packages packages中,以大写字母开头的name是exported name,当import package时,只有exported name可以被从外部访问。 Functions 同type的连续参数可以只在最后指明type。函数可以有多个返回值。 func swap(x, y string) (string, string) { return y, x } Go支持有name的返回值: 函数定义时就定义好返回变量名,在函数内操作返回变量。 用naked return语句返回。 func split(sum int) (x, y int) { x = sum * 4 / 9 y = sum - x retur...阅读全文

博文 2018-10-07 17:35:15 zxdevops

07GO语言函数

go语言函数 1、函数定义 2、参数 3、返回值 4、匿名函数 5、闭包 6、递归 7、延迟调用 8、错误处理 函数特性: Go 函数 不支持 嵌套、重载和默认参数 函数无需声明原型、支持不定长度变参、多返回值、命名返回值参数 支持匿名函数、闭包 函数也可以作为一种类型使用 函数是一等公民,可作为参数传递 函数传递是值的拷贝或者是指针的拷贝,区别在于会不会影响原始值 不定长变参,如果传入slice,一定要用 ...展开传入 1、函数定义 定义函数使用关键字 func,且左大括号不能另起一行 func A(a int,b string) int{ // 参数 a, b 名在前,类型在后 // 如果只有一个返回值,直接写个int就行。表示返回值是一个int型 } func A(a int,b s...阅读全文

博文 2019-03-01 16:34:45 杨旭

golang编程常见问题

1. gitlab/github提交非项目文件(如编译后的二进制文件). 使用.gitignore来忽略提交的文件2. 使用字符串拼接JSON问题举例: responseString := "{ \"code\" : \"0\" , \"data\": { \"username\": " + username + " }}" return []byte(responseString) 如上代码块,因username从外部传入,有JSON注入风险,最佳方法为:使用json.Marshal结构体封装返回值 // JSONStyle return http.data like json style type JSONStyle struct { Code string `json:"code"` ...阅读全文

博文 2019-08-08 10:33:10 道闻

如何才能写出正确的程序?

平时我们写程序的时候,总是莫名其妙的出现Bug,一鼓作气的写完一个接口后,经常被队友喷「你怎么一回事?结果与预期不一致啊」 老脸一红,然后一个人藏在角落调试半天,才发现原来是某一个边界条件没处理好,导致Bug重重,今天我们从二分查找算法,来聊聊如何写出正确的程序 像我们熟知的二分查找算法,在1946年就被提出来了,但是到了1962年才出现了完全没有Bug的二分查找法 二分查找法的思想并不复杂,我们很多人张口就能来,但是为什么间隔了辣么多年,才诞生完全没有Bug的二分查找算法呢? 二分查找算法,难就难在边界条件的处理上,我们经常写出Bug,往往也是出现在边界条件没处理好而导致 因为学习一个算法的思想是很简单的,但是让思想落地,写出完全没有Bug的二分查找,却并不是一件容易的事情 所以我们在写程...阅读全文

博文 2019-06-08 23:32:43 闹闹吃鱼

Go 语言 2019 调查报告发布(内含 Go 语言图谱下载)

<关注公众号,回复 Go 即可下载清晰知识图谱> 对 Go 语言感兴趣但又不知从何学起的同学,可以参考一下 Go 语言系列文章: 为什么你要选择 Go? Go 面向失败编程 带着服务器编程金刚经走进 2020 年 敢问路在何方? Go 官方博客近日公布了 2019 年 Go 语言调查报告。本次调查收到的回复达到 10,975 份,约为去年的两倍。这些受访者的反馈意见将被选取用于改进 Go 语言的发展。 以下是 2019 年度的调查报告摘要: 此调查中,受访者的受众特征与 Stack Overflow 的受访者相似,因此这些结果在某种程度上可以代表更广泛的 Go 开发人员; 大多数受访者每天都要用到 Go 语言,并且该数字在逐年上升; Go 的使用仍集中在技术公司,但它同时也被用于越来越多的行...阅读全文

博文 2020-04-26 10:34:38 阿里巴巴云原生

golang语言渐入佳境[31]-错误处理

12345678910111213//1、创建error对象的方式1 err1 := errors.New("自己创建的错误!") fmt.Println(err1.Error()) fmt.Println(err1) fmt.Printf("err1的类型:%T\n", err1) //*errors.errorString fmt.Println("-----------------") //2、创建error对象的方式2 err2 := fmt.Errorf("错误的类型%d", 10) fmt.Println(err2.Error()) fmt.Println(err2) fmt.Printf("err2的类型:%T\n", err2) //*errors.errorString f...阅读全文

博文 2019-02-21 15:35:51 jonson_jackson