Go语言入门指南3|青训营

43 阅读2分钟

这是 Go 语言学习记录系列的笔记3,快来跟我一起学习Go 的基础语法吧 Go神! 启动!

for

for 循环的()是没有的,但是{}是必须的;而且循环设置中初始化语句和后置语句是可选的,这样就可以当做 while 来用,但是;没法省略

无限循环

如果省略循环条件,该循环就不会结束,因此无限循环可以写得很紧凑,省略分号

for{
}

###条件判断 if

Go 的 if 语句与 for 循环类似,表达式外无需小括号 ( ) ,而大括号 { } 则是必须的。

if 的简短语句

同 for 一样, if 语句可以在条件表达式前执行一个简单的语句。但是该语句声明的变量作用域仅在 if 和else之内

if v := math.Pow(x, n); v < lim {
		return v
	} else{
        v....
        }

分支switch

switch 是编写一连串 if - else 语句的简便方法。它运行第一个值等于条件表达式的 case 语句。 Go 的 switch 语句类似于 C、C++、Java、JavaScript 和 PHP 中的,不过 Go 只运行选定的 case,而非之后所有的 case。 也就是说,Go 自动提供了在这些语言中每个 case 后面所需的 break 语句。 除非以 fallthrough 语句结束,否则分支会自动终止。 Go 的另一点重要的不同在于 switch 的 case 无需为常量,且取值不必为整数。这一点和 cpp 区别很大 switch 的 case 语句从上到下顺次执行,直到匹配成功时停止。 Switch 可以没有条件,等同 switch true 一样。 这种形式能将一长串 if-then-else 写得更加清晰

defer

defer 语句会将函数推迟到外层函数返回之后执行。 推迟调用的函数其参数会立即求值,但直到外层函数返回前该函数都不会被调用。 如果有多个 defer,推迟的函数调用会被压入一个栈中。当外层函数返回时,被推迟的函数会按照后进先出LIFO的顺序调用。

指针

Go 拥有指针。指针保存了值的内存地址。

类型 *T 是指向 T 类型值的指针。其零值为 nil

var p *int

& 操作符会生成一个指向其操作数的指针。

i := 42
p = &i

* 操作符表示指针指向的底层值。

fmt.Println(*p) // 通过指针 p 读取 i
*p = 21         // 通过指针 p 设置 i

这也就是通常所说的“间接引用”或“重定向”。直到这部分和 C\CPP 都是相同的 与 C 不同,Go 没有指针运算。

图像

image 包定义了 Image 接口:

package image

type Image interface {
    ColorModel() color.Model
    Bounds() Rectangle
    At(x, y int) color.Color
}

注意:  Bounds 方法的返回值 Rectangle 实际上是一个 image.Rectangle,它在 image 包中声明。

color.Color 和 color.Model 类型也是接口,但是通常因为直接使用预定义的实现 image.RGBA 和 image.RGBAModel 而被忽视了。这些接口和类型由 image/color 包定义。