Golang tips ----- 函数】的更多相关文章

1.在函数调用时,Golang没有默认参数值 2.一个函数声明如果没有函数体,表面该函数不是由Golang实现的,这样的声明定义了函数标识符 3.拥有函数名的函数只能在包级语法块中被声明 4.函数值(闭包)属于引用类型并且不可比较 5.在循环中生成的所有函数值共享相同的循环变量,并且需要注意的是,函数值记录的是循环变量的地址,而不是循环变量某一刻的值.如果函数值都在循环结束运行的话,那对于循环变量,每个函数对应的都是相同的值.如下面的代码所示,最后迭代运行函数切片,输出的都将是相同的值5.因为它…
在golang中, 函数是第一类值(first-class object), 即函数可以赋值与被赋值. 换言之, 函数也可以作为ReceiverType, 定义自己的method. 实例: http.HandleFunc(pattern string, handler func(ResponseWriter, *Request)) 就是使用上述思想实现. type HandlerFunc func(ResponseWriter, *Request) func (f HandlerFunc) Se…
原文链接 http://www.limerence2017.com/2019/09/11/golang11/#more 函数简介 函数是编程语言中不可缺少的部分,在golang这门语言中函数是一等公民.也是使用好golang的必备技能.看下golang函数的格式 123 func 函数名(函数参数)返回值类型{ } 一个简单的函数 123 func HelloFunc(str string) string{ return str} 该函数返回传入的字符串,函数调用如下 1 fmt.Println…
如果你遇到没有函数体的函数声明,表示该函数不是以Go实现的. package math func Sin(x float64) float //implemented in assembly language 如果为函数的每一个返回值都设置变量名,则会以相应的零值初始化,且在该函数的return语句中省略操作数,这种用法称之为 bare return. go中的错误处理,习惯上是先进行一系列的初始化检查,将处理失败逻辑的代码先行处理,然后才是函数的实际逻辑,这样使得代码更简洁,避免过多的层级结构…
golang中的原子操作在sync/atomic package中. 下文以比较和交换操作函数为例,介绍其使用. CompareAndSwapInt32 比较和交换操作是原子性的. // CompareAndSwapInt32 executes the compare-and-swap operation for an int32 value. func CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool) 判断参数add…
小例题: package main import "fmt" /* 函数练习, 可变参数使用 写一个函数add 支持1个或多个int相加,并返回相加结果 写一个函数concat,支持1个或多个string拼接,并返回结果 */ func add(a int, arg ...int) int { sum := a ; i < len(arg); i++ { sum += arg[i] } return sum } func concat(a string, arg ...strin…
普通函数定义 √ golang函数基本组成:关键字func.函数名.参数列表.返回值.函数体和返回语句. • 语法如下 func 函数名(参数列表) (返回值列表) { // 函数体 } • 示例如下 package main import "fmt" import "errors" func Add(a int, b int) (ret int, err error) { || b < { // 假定只支持两个非负数字的加法 err = errors.New…
今天看Martini文档,其功能列表提到完全兼容http.HandlerFunc接口,就去查阅了Go: net/http的文档,看到type HandlerFunc这部分,顿时蒙圈了.由于之前学习的时候没有关注过function types的知识点,就Google了一些文章,才算是有了个大概的了解. 从golang的官方文档得知function types的解释是这样的. A function type denotes the set of all functions with the same…
golang保留的函数 init(), main()是golang的保留函数,有如下特点: main() 只能用在main包中,仅可定义一个,init() 可定义任意包,可重复定义,建议只定义一个 两个函数定义时不能有任何返回值 只能由go自动调用,不可被引用 init() 先于 main() 执行,并不能被其他函数调用,执行时按照main import顺序执行. 包的执行顺序 Go的初始化和执行总是从main.main函数(main包导入其它的包) 同包下的不同 .go 文件,按照以文件名或包…
1.go test 测试单个函数 go test -v -test.run Test* 2.…
代码示例 package test import ( "fmt" "testing" ) type testInt func(int) bool func isOdd(integer int) bool { == { return false } return true } func isEven(integer int) bool { == { return true } return false } func filter(slice []int, f test…
启动了两个goroutine,并完成一些工作.在各自循环的每次迭代之后,在goroutine 会使用LoadInt64 来检查shutdown 变量的值.这个函数会安全地返回shutdown 变量的一个副本.如果这个副本的值为1,goroutine 就会跳出循环并终止. package main import ( "fmt" "sync" "sync/atomic" "time" ) var ( //通知正在执行的gorout…
1.atomic包里的几个函数以及sync包里的mutex类型,提供了解决方案2.原子函数能够以很底层的加锁机制来同步访问整型变量和指针3.atomic.AddInt64(&counter, 1)的原理是强制同一时刻只能有一个goroutine运行并完成这个加法操作 package main import ( "fmt" "runtime" "sync" "sync/atomic" ) var ( //全局变量 cou…
package main import ( "fmt" "time" ) func main(){ //[时间获取及格式化] //获取当前时间 now_time := time.Now() fmt.Printf("Now_time=%v,数据类型:%T", now_time, now_time) //通过now获取年月日时分秒 fmt.Printf("年=%v\n", now_time.Year()) fmt.Printf(&…
package main import ( "fmt" "strings" ) func main(){ //返回字符在指定字符串中最后一次出现的位置 last_index := strings.LastIndex("Hello World", "l") fmt.Printf("last_index=%v\n", last_index) //last_index=9 //字符串替换,类似php的str_re…
package main import ( "fmt" "strings" "strconv" ) func main(){ //返回字符串的(字节)长度,相当于PHP的strlen str := "hello世界" //11 ,golang的编码统一为utf-8,字母和数字分别占一个字节,汉子占用3个字节 fmt.Println(len(str)) //字符串遍历 str2 := "hello世界" //…
概念所谓匿名函数,就是没有名字的函数匿名函数的两种使用方式一.在定义匿名函数的时候就可以直接使用(这种方式只使用一次) package main import ( "fmt" ) func main(){ res1 := func (n1 int, n2 int) int { return n1 + n2 }(, ) //括号里的10,30 就相当于参数列表,分别对应n1和n2 fmt.Println("res1=",res1) } D:\goproject\src…
init函数有一下几点特性: init函数在main执行之前,自动被调用执行的,不能显示调用 每个包的init函数在包被引用时,自动被调用 每个包可以有多个init函数 同一个文件中可定义多个init()函数 package main import ( "fmt" ) func init() { fmt.Println("1 t.go....") } func init() { fmt.Println("2 t.go....") } func m…
先写一个公共函数, 比如在 common 包下有这么一个方法: // 写超时警告日志 通用方法 func TimeoutWarning(tag, detailed string, start time.Time, timeLimit float64) {     dis := time.Now().Sub(start).Seconds()     if dis > timeLimit {         log.Warning(log.CENTER_COMMON_WARNING, tag, &quo…
在函数内部,没有名字的函数,就是匿名函数 实现方法1: func main(){ a := "我是无参无返回值的匿名函数" x := func(){ //可以获取到匿名函数外部的变量的,包括全局的变量 fmt.Println(a) } //调用匿名函数 x() } 实现方法2: func main(){ a := "我是无参无返回值的匿名函数" func(){ //可以获取到匿名函数外部的变量的,包括全局的变量 fmt.Println(a) } // 如果直接这样,…
// test01 project main.go package main import ( "fmt" ) // 单返回值的函数 func plus(a int, b int) int { // Go 需要明确的返回值 return a + b } // (int, int) 在这个函数中标志着这个函数返回 2 个 int. func vals() (int, int) { return 3, 7 } // 可变参数函数.可以用任意数量的参数调用.例如,fmt.Println 是一…
函数介绍 Go语言函数基本组成包括: 关键字func 函数名 参数列表 返回值 函数体 返回语句 语法如下: func 函数名(参数列表) (返回值列表) { // 函数体 return } 除了main().init()函数外,其它所有类型的函数都可以有参数与返回值 一个简单的例子: package main func main() { println("In main before calling greeting") greeting() println("In mai…
package main import ( "fmt" "strings" ) // 使用type关键字让函数变成一个自定义类型 type caseFunc func(string) string type funcOddEven func(int) bool func main() { /* 将函数名当做实参进行传递 */ strToCase1("hello World!", ProcessCase1) // 字母大小交替显示 var nums…
1. 函数当做函数的参数 package main import "fmt" type HandleFunc func(int) (int, bool) func add10(num1 int) (int, bool) { return num1 + 100, true } func proxy(data int, exec HandleFunc) int { data, flag := exec(data) if flag { return data } else { return…
package main import "fmt" // 一个函数中最多只可有一个可变参数, 如果参数列表中还有其它类型的参数,则可变参数写在最后 // 注意:参数不定,参数的个数是0-N个,也就是说可变参数可以为空 func sumNumber(num1 float64, nums ...float64) (sum, avg float64, count int) { for _, v := range nums { sum += v count += 1 } sum += num1…
package main import "fmt" type TestStruct struct { } func (object *TestStruct) test(msg string) { fmt.Println(msg) } type CallBack func(msg string) func callBackTest(pFunc CallBack) { pFunc(") } func main() { object := new(TestStruct) callB…
数组切片内容复制 转自:http://studygolang.com/articles/4560 用于将内容从一个数组切片复制到另一个数组切片.如果加入的两个数组切片不一样大,就会按其中较小的那个数组切片的元素个数进行复制. slice1 := []int{1, 2, 3, 4, 5} slice2 := []int{5, 4, 3} copy(slice2, slice1) // 只会复制slice1的前3个元素到slice2中 copy(slice1, slice2) // 只会复制slic…
简介 内建函数 make 用来为 slice,map 或 chan 类型分配内存和初始化一个对象(注意:只能用在这三种类型上) slice // 长度为5,容量为10的slice,slice中的元素是int var slice_ []int = make([]int,5,10) fmt.Println(slice_) var slice_1 []int = make([]int,5) fmt.Println(slice_1) var slice_2 []int = []int{1,2} fmt.…
func main() { a := models.SmsVerify{} a.Id = 100 fmt.Println(a.Id) // 100 test111(a) fmt.Println(a.Id) // 100 a222 := new(models.SmsVerify) a222.Id = 200 fmt.Println(a222.Id) // 200 test222(a222) fmt.Println(a222.Id) // 201 } func test111(sms models.…
verb 描述 %d 十进制整数 %x, %o, %b 十六进制.八进制.二进制整数 %f, %g, %e 浮点数:如 3.141593, 3.141592653589793, 3.141593e+00 %t 布尔型:true 或 false %c 字符(Unicode 码点) %s 字符串 %q 带引号字符串(如 "abc")或者字符(如 'c') %v 内置格式的任何值 %T 任何值的类型 %% 百分号本身(无操作数)…