go 编程小tips
来源:互联网 发布:类似三年二班的淘宝店 编辑:程序博客网 时间:2024/04/20 22:59
1,if条件语句注意事项:条件语句不需要使用括号将条件包含起来 () ; 无论语句体内有几条语句,花括号 {} 都是必须存在的; 左花括号 { 必须与 if 或者 else 处于同一行; 在 if 之后,条件语句之前,可以添加变量初始化语句,使用 ; 间隔;
2,slice可直接使用append对其进行添加元素如append(slice,slice对应元素),也可直接在slice中添加slice,不过此时写法为append(slice1,slice2…),其中slice2后有…表示将slice2打散成元素后再添加到slice1中
3,break可以后面加标签,表示跳出对应标签的循环。如break Look表示跳出外层循环。
Loop: for i := 0; i < 5; i++ { for j := 0; j < 5; j++ { if j >= 4 { break Loop } } }
4,go中可使用不定参数,其使用方法如下:“…type”表示具有不定个type类型的参数,不定参数实质上是一个slice类型,故可以使用range对其参数进行取值。如下例子。
func myfunc(args ...int) { for _, arg := range args { fmt.Println(arg) }}
5.go语言中没有构造函数的概念,对象的构建通常交给一个全局构建函数来构建,通常以NewXXX来命名,表示构造函数。如
func NewRect(x, y, width, height float64) *Rect { return &Rect{x, y, width, height}}
6.go语言中对于堆和栈的内存分配没有严格区分,在go中返回一个局部变量的地址是绝对没有问题的,变量关联的存储在函数返回后依然存在.(注:尤其对由C/C++转过来的程序员,开始肯定不是很适应,但是go这种内存分配方式解放了程序员,使得程序员能够专注做事情,而不用花费太多的时间在堆和栈的内存分配上).更直接的说,在go语言中,如果一个局部变量在函数返回后仍然被使用,那么这个变量会在堆heap,而不是栈stack中进行内存分配.详情参考How do I know whether a variable is allocated on the heap or the stack?
7. golang允许多个返回值,并且返回值有两种形式,一种只是指定类型,还有一种指定返回值名称.如下所示:
func SumAndProduct(a, b int) (int, int) { return a+b, a*b} func SumAndProduct(a, b int) (add int, Multiplied int) { add = a + b; Multiplied = a * b; return}当定义函数时指定返回参数变量时,可以直接返回而不用带变量名。注意:如果命令的返回参数跟函数代码块中的变量同名,他会被隐藏,此时需显示return返回结果;还有就是显式return会先修改命名返回值,然后再执行defer延迟语句。由于会出现函数中临时变量名和指定返回值名字冲突的情况,所以建议使用不指定返回值名称的形式.
8.参数之变参:
golang支持变参,变量中所有参数的类别必须是同一种,且必须是最后一个形参。函数内获取变参为一个slice。函数声明为:func FuncName(args ...int) { } args ...int 告诉go这个函数接受变参参数。 使用如sum(x[2:6]...)
9. defer 与return执行顺序
当函数执行到最后时,先执行defer语句,然后才执行return语句.所以可以利用这个来进行资源安全关闭,解加锁,记录执行情况等。defer是采用先进后出的模式的,这种情形与栈的情况一致。注意:定义的defer延迟操作,如有提供参数会发生值的拷贝,尽管这些函数在退出时才执行,但所使用的参数是在定义时就进行拷贝,拷贝的原则和变量的赋值原则一个,slice,map,channel是指针拷贝.如下例子:
当函数执行到最后时,先执行defer语句,然后才执行return语句.所以可以利用这个来进行资源安全关闭,解加锁,记录执行情况等。defer是采用先进后出的模式的,这种情形与栈的情况一致。注意:定义的defer延迟操作,如有提供参数会发生值的拷贝,尽管这些函数在退出时才执行,但所使用的参数是在定义时就进行拷贝,拷贝的原则和变量的赋值原则一个,slice,map,channel是指针拷贝.如下例子:
<span style="color:#000000;">package mainimport ("fmt")func main() {x := 1defer func(a int) { //直接将x=1赋值给a,虽然他在后面才执行.fmt.Println("a=", a)}(x)defer func() {fmt.Println("x=", x) //经过x++后,x值变为2}()x++}运行结果: x= 2 a= 1</span>
0 0
- go 编程小tips
- Go小tips
- 编程中的小tips
- 编程小问题和Tips(C#)
- 编程小问题和Tips(数据库)
- 编程小问题和Tips(js)
- [基础]编程小问题和Tips
- C&C++编程过程中的小Tips
- Android 编程小提示Stability Tips
- 写给小白的编程入门Tips
- 小tips
- 小tips
- 小Tips
- 编程小问题和Tips(C与C++)
- Linux下C编程小Tips--持续update~
- object-c编程tips-global_queue的一个小测试
- 编程tips
- 编程tips
- 【转】bitmap算法
- sd有多个分区格式化成一个分区
- Java IO流学习
- 黑马程序员-----面向对象总结(一)
- LeetCode-Text Justification
- go 编程小tips
- Spring事务超时时间可能存在的错误认识
- UVA 538 - Balancing Bank Accounts(贪心)
- 笔试题—黑板上1—50
- EhCache 缓存介绍
- hdu 4911
- UESTC 890 Card Trick(DP 纸牌魔术)
- 小记(1)关于lisview的动态更改数据与notifyDataSetChanged();
- 关于Z序的总结