[huayang]
基本结构和基本数据类型
Go 程序的基本结构和要素
四种导入方式
如果你导入了一个包却没有使用它,则会在构建程序时引发错误,如 imported and not used: os
main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init () 函数则会先执行该函数)。如果你的 main 包的源代码没有包含 main 函数,则会引发构建错误 undefined: main.main。main 函数既没有参数,也没有返回类型(与 C 家族中的其它语言恰好相反)。如果你不小心为 main 函数添加了参数或者返回类型,将会引发构建错误:
func main must have no arguments and no return values results.
只有当某个函数需要被外部包调用的时候才使用大写字母开头,并遵循 Pascal 命名法;否则就遵循骆驼命名法,即第一个单词的首字母小写,其余单词的首字母大写。
常量
常量使用关键字 const
定义
const Pi = 3.14159
还可以这样写
可以看到每当 iota
在新的一行被使用时,它的值都会自动加 1
iota=0就完事了,不要尝试过多的理解
变量
声明变量的一般形式是使用 var
关键
Go 和许多编程语言不同,它在声明变量时将变量的类型放在变量的名称之后
var a int
var a bool
var a string
当然也可以写为这种格式
var (
a int
b bool
str string
)
当一个变量被声明之后,系统自动赋予它该类型的零值:int 为 0,float 为 0.0,bool 为 false,string 为空字符串,指针为 nil。记住,所有的内存在 Go 中都是经过初始化的
变量的命名规则遵循骆驼命名法,即首个单词小写,每个新单词的首字母大写,例如:numShips
和 startDate
一般情况下,当变量 a 和变量 b 之间类型相同时,才能进行如 a = b
的赋值。
Go 编译器的智商已经高到可以根据变量的值来自动推断其类型
意思是不用对他进行定型,这和python一个意思
var (
a = 15
b = false
str = "Go says hello to the world!"
numShips = 50
city string
)
当你在函数体内声明局部变量时,应使用简短声明语法 :=
,例如:
func main() {
a := 1
fmt.Println(a)// 1
}
简短形式,使用 := 赋值操作符
用:=进行赋值,就不用var设置变量了
如果在相同的代码块中,我们不可以再次对于相同名称的变量使用初始化声明
这里有个知识点,print为错误输出流,所以使用有问题不适合打印,标准输出流为fm.print
而:
fmt.Println :可以打印出字符串,和变量
fmt.Printf : 只可以打印出格式化的字符串,可以输出字符串类型的变量,不可以输出整形变量和整形
fmt.Println 打印的每一项之间都会有空行,Print 没有
基本类型和运算符
布尔类型 bool
布尔型的值只可以是常量 true 或者 false
利用括号同样可以升级某个表达式的运算优先级
在格式化输出时,你可以使用 %t
来表示你要输出的值为布尔型
数字类型
在格式化输出时,你可以使用 %
d 来表示你要输出的值为布尔型
运算符的优先级
由于编译器行尾自动补全分号的缘故,加号 +
必须放在第一行。
控制结构
if-else 结构
关键字 if 和 else 之后的左大括号 {
必须和关键字在同一行,如果你使用了 else-if 结构,则前段代码块的右大括号 }
必须和 else-if 关键字在同一行
if x{
}
else { // 无效的
}
package main
import "fmt"
func main() {
bool1 := true
if bool1 {
fmt.Printf("The value is true\n")
} else {
fmt.Printf("The value is false\n")
}
}
当 if 结构内有 break、continue、goto 或者 return 语句时,Go 代码的常见写法是省略 else 部分(另见第 5.2 节)。无论满足哪个条件都会返回 x 或者 y 时,一般使用以下写法
if condition {
return x
}
return y
不要同时在 if-else 结构的两个分支里都使用 return 语句,这将导致编译报错 function ends without a return statement
for 结构(for循环)
基于计数器的迭代
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
fmt.Printf("This is the %d iteration\n", i)
}
}
循环嵌套
for i:=0; i<5; i++ {
for j:=0; j<10; j++ {
println(j)
}
}
基于条件判断的迭代
package main
import "fmt"
func main() {
var i int = 5
for i >= 0 {
i = i - 1
fmt.Printf("The variable i is now: %d\n", i)
}
}
无限循环
package main
import "fmt"
func main() {
var i int = 5
for {
i = i - 1
fmt.Printf("The variable i is now: %d\n", i)
}
}
fBreak 与 continue
break 语句的作用结果是跳过整个代码块,执行后续的代码
package main
func main() {
for i:=0; i<3; i++ {
for j:=0; j<10; j++ {
if j>5 {
break
}
print(j)
}
print(" ")
}
}
关键字 continue 忽略剩余的循环体而直接进入下一次循环的过程,但不是无条件执行下一次循环,执行之前依旧需要满足循环的判断条件
package main
func main() {
for i := 0; i < 10; i++ {
if i == 5 {
continue
}
print(i)
print(" ")
}
}
标签与 goto
for、switch 或 select 语句都可以配合标签(label)形式的标识符使用,即某一行第一个以冒号(:
)结尾的单词(gofmt 会将后续代码自动移至下一行)
package main
import "fmt"
func main() {
LABEL1:
for i := 0; i <= 5; i++ {
for j := 0; j <= 5; j++ {
if j == 4 {
continue LABEL1
}
fmt.Printf("i is: %d, and j is: %d\n", i, j)
}
}
}
本例中,continue 语句指向 LABEL1,当执行到该语句的时候,就会跳转到 LABEL1 标签的位置。
另外,还可以使用 goto 语句和标签配合使用来模拟循环
package main
func main() {
i:=0
HERE:
print(i)
i++
if i==5 {
return
}
goto HERE
}
特别注意 使用标签和 goto 语句是不被鼓励的:它们会很快导致非常糟糕的程序设计,而且总有更加可读的替代方案来实现相同的需求
函数
函数参数与返回值
在函数块里面,return
之后的语句都不会执行
函数定义时,它的形参一般是有名字的,不过我们也可以定义没有形参名的函数,只有相应的形参类型,就像这样:func f(int, int, float64)。
没有参数的函数通常被称为 niladic 函数(niladic function),就像 main.main()
package main
import "fmt"
func main() {
fmt.Printf("Multiply 2 * 5 * 6 = %d\n", MultiPly3Nums(2, 5, 6))
// var i1 int = MultiPly3Nums(2, 5, 6)
// fmt.Printf("MultiPly 2 * 5 * 6 = %d\n", i1)
}
func MultiPly3Nums(a int, b int, c int) int {
// var product int = a * b * c
// return product
return a * b * c
}
[/huayang]
FROM:浅浅淡淡[hellohy]
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论