ZXH的 《Go 语言入门指南:基础语法和常用特性解析-4》|青训营

71 阅读4分钟

Day4:《Go 语言入门指南:基础语法和常用特性解析-4》

1.时间和日期

time 包为我们提供了一个数据类型 time.Time(作为值使用)以及显示和测量时间和日期的功能函数。

当前时间可以使用 time.Now() 获取,或者使用 t.Day()、t.Minute() 等等来获取时间的一部分。

值得一提的是,我们可以自定义时间格式化字符串

例如: fmt.Printf("%02d.%02d.%4d\n", t.Day(), t.Month(), t.Year())

这将会输出: 21.07.2011。

Duration 类型表示两个连续时刻所相差的纳秒数,类型为 int64。Location 类型映射某个时区的时间,UTC 表示通用协调世界时间。

包中的一个预定义函数 func (t Time) Format(layout string) string 可以根据一个格式化字符串来将一个时间 t 转换为相应格式的字符串,你可以使用一些预定义的格式,如:time.ANSIC 或 time.RFC822。

一般的格式化设计是通过对于一个标准时间的格式化描述来展现的,这听起来很奇怪(02 Jan 2006 15:04 是 Go 语言的诞生时间且自定义格式化时必须以此时间为基准),直接看下面这个例子:

fmt.Println(t.Format("02 Jan 2006 15:04")) 

输出
21 Jul 2011 10:31

2.控制结构

Go中主要提供了下面这些条件结构和分支结构:

  • if - else 结构
  • switch 结构
  • select 结构,用于 channel 的选择

可以使用迭代或循环结构来重复执行一次或多次某段代码(任务):

  • for ( range ) 结构

一些如 break ****和 continue ****这样的关键字可以用于中途改变循环的状态。

此外,你还可以使用 return ****来结束某个函数的执行,或使用 goto ****和标签来调整程序的执行位置。

此外,Go 完全省略了 if、switch 和 for 结构中条件语句两侧的括号。

3.if-else 结构

if 是用于测试某个条件(布尔型或逻辑型)的语句,如果该条件成立,则会执行 if 后由大括号括起来的代码块,否则就忽略该代码块继续执行后续的代码。

if condition {
	// do something	
}

如果存在第二个分支,则可以在上面代码的基础上添加 else 关键字以及另一代码块,这个代码块中的代码只有在条件不满足时才会执行。if 和 else 后的两个代码块是相互独立的分支,只可能执行其中一个。

if condition {
	// do something	
} else {
	// do something	
}

如果存在第三个分支,则可以使用下面这种三个独立分支的形式:

if condition1 {
	// do something	
} else if condition2 {
	// do something else	
} else {
	// catch-all or default
}

else-if 分支的数量是没有限制的,但是为了代码的可读性,还是不要在 if 后面加入太多的 else-if 结构。如果你必须使用这种形式,则把尽可能先满足的条件放在前面。

即使当代码块之间只有一条语句时,大括号也不可被省略(尽管有些人并不赞成,但这还是符合了软件工程原则的主流做法)。

比较有意思的是,go限制了大括号的位置:

关键字 if 和 else 之后的左大括号 { 必须和关键字在同一行,如果你使用了 else-if 结构,则前段代码块的右大括号 } 必须和 else-if 关键字在同一行。这两条规则都是被编译器强制规定的。

非法的 Go 代码:

if x{
}
else {	// 无效的
}

4.多返回值函数 (重要知识点)

Go 语言的函数经常使用两个返回值来表示执行是否成功:返回某个值以及 true 表示成功;返回零值(或 nil)和 false 表示失败。当不使用 true 或 false 的时候,也可以使用一个 ****error 类型的变量来代替作为第二个返回值:成功执行的话,error 的值为 nil,否则就会包含相应的错误信息(Go 语言中的错误类型为 error: var err error)。

这样一来,就很明显需要用一个 if 语句来测试执行结果;由于其符号的原因,这样的形式又称之为“逗号 ok 模式”(comma, ok pattern)。

函数 strconv.Atoi() 的作用是将一个字符串转换为一个整数。相关的错误检查:

//无视错误的代码,如果origStr 不能被转换为整数,anInt 的值会变成 0 而 _ 无视了错误,程序会继续运行。
anInt, _ = strconv.Atoi(origStr)

//进行错误检查的代码
an, err := strconv.Atoi(orig)
if err != nil {
		fmt.Printf("orig %s is not an integer - exiting with error\n", orig)
		return
	} 
	fmt.Printf("The integer is %d\n", an)

今天的学习就到这里啦,明天再见~