第一部分:基本数据类型和操作符
1. 文件名&关键字&标识符
(1)所有go源码以.go结尾
(2)标识符以字母或下划线开头,大小写敏感,比如:
a. boy b. Boy c. a+b d. 0boy e. _boy f. =_boy g. _
其中:a b e符合表示服的命名规范
(3) _是特殊标识符,用来忽略结果
(4)保留关键字
2. Go程序基本结构
package main import ( "fmt" ) func main() { fmt.Println("hello world!") }
(1) 任何一个代码文件隶属于一个包
(2)import 关键字,引用其他包:
import("fmt")
import("os")
通常习惯写成:
import (
"fmt"
"os"
)
(3) golang可执行程序,package main,
并且有且只有一个main入口函数
(4)包中函数调用:
a. 同一个包中函数,直接调用
b. 不同包中函数,通过包名+点+函数名进行调用
(5)包访问控制规则:
a. 大写意味着这个函数/变量是可导出的
b. 小写意味着这个函数/变量是私有的,包外部不能访问
准备:先创建F:\Go\project\src\go_dev\day2目录,并在该目录下创建example1,example2目录,并在example2目录下创建add,main,test目录
练习1. 写一个程序,对于给定一个数字n,求出所有两两相加等于n的组合。比如: 对于n=5,所有组合如下所示:
0 + 5 = 5
1 + 4 = 5
2 + 3 = 5
3 + 2 = 5
4 + 1 = 5
5 + 0 = 5
在F:\Go\project\src\go_dev\day2\example1目录下创建main.go文件
package main import "fmt" func list(n int) { for i := 0; i <= n; i++ { fmt.Printf("%d + %d = %d\n", i, n - i, n) } } func main() { list(10) }
练习2:一个程序包含两个包add和main,其中add包中有两个变量:Name和age。请问main包中如何访问Name和age?
先来看下面例子1:
package main import "fmt" func test() { fmt.Println(str) } func main() { test() } var str string = "hello world"
运行结果:
注意: 我们定义了一个全局变量 str 为字符串类型,可以看出在程序运行时,全局变量是先被初始化, 且不像C语言,全局变量初始化与其位置无关。
例子2:
在add目录下创建add.go文件,内容如下
package add var Name string = "hello world" var age int = 10
在main目录下创建main.go文件,内容如下
package main import ( "fmt" "go_dev/day2/example2/add" ) func main() { fmt.Println("Name = ", add.Name) fmt.Println("age = ", add.age) }
运行该程序:
报错的原因是:在go中变量首字母大写表示该变量可以导出,由于age首字母小写无法导出所以报错,解决方法就是将 age -> Age。
改完之后运行结果如下:
练习3: 包别名的应用,开发一个程序,使用包别名来访问包中的函数?
其中add.go不变,main.go如下: 其中在引入包前面加别名(a "go_dev/day2/example2/add")
package main import ( "fmt" a "go_dev/day2/example2/add" ) func main() { fmt.Println("Name = ", a.Name) fmt.Println("age = ", a.Age) }
运行结果:
练习4: 每个源文件都可以包含一个init函数,这个init函数自动被go运行框架调用。开发一个程序演示这个功能?
首先再来看下练习2:
add.go
package add var Name string var Age int Name = "hello world" Age = 10
main.go
package main import ( "fmt" a "go_dev/day2/example2/add" ) func main() { fmt.Println("Name = ", a.Name) fmt.Println("age = ", a.Age) }
运行结果:
结果分析:报错的原因是 Name = "hello world" 和 Age = 10没有放在函数体里面
修改add.go为:
package add var Name string var Age int func Change() { Name = "hello world" Age = 10 }
注意:add.go方法名Change首字母必须大写,否则无法导出被外部调用。
修改main.go为:
package main import ( "fmt" a "go_dev/day2/example2/add" ) func main() { a.Change() fmt.Println("Name = ", a.Name) fmt.Println("age = ", a.Age) }
运行结果:
再来看练习4:
add.go将Change修改为init,init函数自动被go运行框架调用
package add var Name string var Age int func init() { Name = "hello world" Age = 10 }
main.go
package main import ( "fmt" a "go_dev/day2/example2/add" ) func main() { fmt.Println("Name = ", a.Name) fmt.Println("age = ", a.Age) }
运行结果:
练习5: 包的只初始化,不引用。请开发一个程序,演示这个做法?
add.go
package add import( _ "go_dev/day2/example2/test" ) func init () { Name = "hello world" Age = 20 } var Name string = "xxxxx" var Age int = 100
test.go(在test目录下创建)
package test import( "fmt" ) var Name string = "this is in test package" var Age int = 1000 func init() { fmt.Println("this is a test") fmt.Println("test.package.Name=", Name) fmt.Println("test.package.age=", Age) Age = 10 fmt.Println("test.package.age=", Age) }
main.go
package main import ( "fmt" a "go_dev/day2/example2/add" ) func main() { fmt.Println("Name = ", a.Name) fmt.Println("age = ", a.Age) }
下运行结果:
结果分析:
1. 在add.go中的 _ 表示包的只初始化(只执行test.go中的init函数),不引用。
2. 变量 Name和Age在每个包里面是相互独立的,在test.go中修改Name和Age并不会影响add.go中的这两个变量
3. 在add.go中,init函数是在全局变量Name和Age的前面,但是其值依然被改变(其执行顺序是先初始化全局变量 --> init,因此值会被改变)。
2. 一个程序包含两个包add和main,其中add包中有两个变量:Name和age。请问main
包中如何访问Name和age?
3. 常量和变量
4. 数据类型和操作符
5. 字符串类型