第02天-基础-包、函数、常量、数据类型、字符操作

第一部分:基本数据类型和操作符

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. 字符串类型

猜你喜欢

转载自www.cnblogs.com/xuejiale/p/10340091.html