我的站点

一个系统软件工程师的随手涂鸦

Category: Go语言实践技巧 (Page 2 of 2)

Go语言实践技巧(6)——map key的选择

The map key can be a value from any built-in or struct type as long as the value can be used in an expression with the == operator. Slices, functions, and struct types that contain slices can’t be used as a map key.

 

map key可以使用任何内置类型或结构类型的值,只要这个值可以使用在==表达式中。slice,函数,和包含slice的结构体不能用作key

参考资料:
Go in Action

Go语言实践技巧(5)——defer

defer语句使用例子如下:

file, err := os.Open(dataFile)
if err != nil {
    ...
}
defer file.Close()

defer语句可以看成是把指定的函数压入“堆栈”,当外面函数退出时(即使发生panic),“堆栈”内的函数会依次弹出执行。这样可以防止资源泄露。

Go语言实践技巧(4)——goroutine之间切换的时间点

以下列出了goroutine之间切换的主要的时间点:

(1)Channel发送和接收操作(如果这些操作是阻塞的);
(2)执行go语句,虽然不能保证新的goroutine马上被调度执行;
(3)阻塞的系统调用,像文件操作,网络操作等等;
(4)停下来进入垃圾回收周期以后。

换句话讲,在goroutine不能继续进行运算以后(需要更多数据,更多空间,等等),都会进行切换。

参考资料:
Performance without the event loop

Go语言实践技巧(3)——range的使用范围

Go语言关键字range可以作用在arraystringslicemapchannel五种数据结构上。

Go语言实践技巧(2)——package定义和初始化

(1)一个文件夹下的所有文件必须属于同一个package,一个好的规则是package和文件夹名字相同。此外,要注意import语句所指定的是寻找packagepath,而不是package的名字。关于这个话题讨论,请参见Is the package name must same with name folder name?

另外,要注意import的语法(参考这里):

import packagename importpath

举例如下:

Import declaration          Local name of Sin

import   "lib/math"         math.Sin
import m "lib/math"         m.Sin
import . "lib/math"         Sin

在第二种情况下,mpackage名字;第三种情况下,使用math package可以省略package名字。

 

(2)

import (
_ "github.com/xxx"
)

这种做法可以保证”github.com/xxx“这个package的初始化操作完成(这个package中所有init函数都执行),即使在当前文件中没有显式地使用到这个package

Go语言实践技巧(1)——变量定义

Go语言变量定义的一个好的实践技巧是:

(1)如果变量声明时会被赋给数据类型的非“0”值,则使用“:=”这种方式:

a := 3
b := fun1()

(2)否则,因为所有变量声明时都会初始化为数据类型的“0”值,则使用var关键字定义这种方式:

var a int;

Page 2 of 2

Powered by WordPress & Theme by Anders Norén