作者: isuntong | 来源:发表于2020-03-15 20:48 被阅读0次

    init()函数

    package utils
    
    import "fmt"
    
    //目录和包的名字不一定相同,但是往往要一直
    //同一个目录下包名必须一样
    //大写可以导出
    func Count(){
        fmt.Println("utils包的Count()函数")
    }
    
    func init(){
        fmt.Println("units包的init()函数")
    }
    
    
    package main
    
    import "demo/utils" //绝对路径
    
    func main(){
    
        /*
        一个目录下的同级文件归属一个包,package的生命要一致
        package生命的包和对应的目录可以不一致
        */
    
        //utils.Count()
        //timeutils.PrintTime()
        //
        //pk2.MyTest1()
    
        utils.Count()
    }
    
    
    package utils
    
    import "fmt"
    
    //目录和包的名字不一定相同,但是往往要一直
    //同一个目录下包名必须一样
    //大写可以导出
    func Count(){
        fmt.Println("utils包的Count()函数")
    }
    
    func init(){
        fmt.Println("units包的init()函数")
    }
    
    func init(){
        fmt.Println("units包的另一个init()函数")
    }
    
    
    package main
    
    import (
        "demo/pk2"
        "demo/utils"
    ) //绝对路径
    
    func main(){
    
        /*
        一个目录下的同级文件归属一个包,package的生命要一致
        package生命的包和对应的目录可以不一致
        */
    
        //utils.Count()
        //timeutils.PrintTime()
        //
        pk2.MyTest1()
    
        utils.Count()
    }
    

    先导入的包的init函数先执行

    init()函数和main()函数

    1. 这两个函数都是go中的保留函数
    2. 定义的时候不能有参数,返回值,只能由go程序自动调用,不能被引用
    3. init函数可以定义在任意包,可以有多个,main函数只能在main包下,并且只能有一个
    4. 执行顺序
      见上图

    包的其他注意点

    package main
    
    import (
        _ "demo/pk2"
    ) //绝对路径
    
    func main(){
    
        /*
        一个目录下的同级文件归属一个包,package的生命要一致
        package生命的包和对应的目录可以不一致
        */
    
        //utils.Count()
        //timeutils.PrintTime()
    
    
        //只想调用MyTest1的init函数,不想调用这个函数
        // pk2.MyTest1()
    
        // utils.Count()
    }
    
    
    1. 可以下载下来放到src目录下,目录src/github.com/go-sql-driver/mysql 然后再放下源代码

    适合没有网络,拷贝来的

    1. 命令行任意位置执行 go get github.com/go-sql-driver/mysql
    package main
    
    import (
        "database/sql"
        "fmt"
        _ "github.com/go-sql-driver/mysql"
    
        _ "demo/pk2"
    ) //绝对路径
    
    func main(){
    
        /*
        一个目录下的同级文件归属一个包,package的生命要一致
        package生命的包和对应的目录可以不一致
        */
    
        //utils.Count()
        //timeutils.PrintTime()
    
    
        //只想调用MyTest1的init函数,不想调用这个函数
        // pk2.MyTest1()
    
        // utils.Count()
    
        // database/sql 打开数据库
        // 用下划线导入github.com/go-sql-driver/mysql,只使用里面的init函数初始化
        db,err := sql.Open("mysql","root:用户密码@tcp(127.0.0.1:3306)/数据库名字?charset=utf8")
        if err != nil {
            fmt.Println("错误信息:",err)
            return
        }
        fmt.Println("连接成功",db)
    
    }
    
    

    包会被编译为.a文件,在pkg目录下

    go build demo
    ./demo

    这样执行是没有.a文件的

    需要go install demo/pk2

    直接点击运行里面包含go install

    time包

    package main
    
    import (
        "fmt"
        "math/rand"
        "time"
    )
    
    func main() {
        /*
        time包:
            1年=365天
            1天=24小时
            1小时=60分钟
            1分钟=60秒
    
            毫秒 millisecond
            微秒 microsecond
            纳秒 nanosecond
            皮秒 picosecond
        我们获取
        */
    
        //1。获取当前时间
        t1 := time.Now()
        fmt.Printf("%T\n",t1) //time.Time
        fmt.Println(t1) //2020-03-17 11:13:59.686591 +0800 CST m=+0.000468423
    
        //2。 获取当前的时间
        t2 := time.Date(2020,3,17,11,16,30,0,time.Local)
        fmt.Println(t2) //2020-03-17 11:16:30 +0800 CST
    
        //3。 time string之间的转换  模版不可以改变 1 2 3 4 5 6,不然会出错,纪念go
        s1 := t1.Format("2006年1月2日 15:04:05")
        fmt.Println(s1) //2020年3月17日 11:22:43
    
        s2 := t1.Format("2006/01/02")
        fmt.Println(s2) //2020/03/17
    
        s3 := "1999年02月21日" //string 写成2月21日下面的模版就解析不了了
        t3,err := time.Parse("2006年01月02日",s3)
        if err != nil {
            fmt.Println("err:",err)
        }
        fmt.Println(t3) //1999-02-21 00:00:00 +0000 UTC
        fmt.Printf("%T\n",t3) //time.Time
    
    
        //4。 获取单独日期的方法,不是函数,因为指定了time 类型的对象
        year,month,day := t1.Date() //年月日
        fmt.Println(year,month,day) //2020 March 17 month是包定义的类型,里面有常量
    
        hour,min,sec := t1.Clock()
        fmt.Println(hour,min,sec) //11 33 12
    
        year2 := t1.Year()
        fmt.Println("年:",year2) //年: 2020
        fmt.Println(t1.YearDay()) //过了多少天 77
    
        fmt.Println(t1.Weekday()) //Tuesday
    
        //5. 时间戳:指定的日期 距离1970年1月1日0时0分0秒的时间差值 秒,纳秒
        t4 := time.Date(1970,1,1,1,0,0,0,time.UTC)
        timestamp1 := t4.Unix() //秒差值 3600
        fmt.Println(timestamp1) //
        timestamp2 := t1.Unix()
        fmt.Println(timestamp2) //1584416475
    
        timestamp3 := t4.UnixNano() //纳秒差值
        fmt.Println(timestamp3) //3600000000000
    
        //6。 时间间隔
        t5 := t1.Add(time.Minute)
        fmt.Println(t1) //2020-03-17 11:43:31.081654 +0800 CST m=+0.000417273
        fmt.Println(t5) //2020-03-17 11:44:31.081654 +0800 CST m=+60.000417273
        fmt.Println(t1.Add(24 * time.Hour)) //2020-03-18 11:43:31.081654 +0800 CST m=+86400.000417273
    
        //7. 程序睡眠
        time.Sleep(3 * time.Second) //让当前的程序进入睡眠状态
        fmt.Println("main...over...")
    
        rand.Seed(time.Now().UnixNano())
        randNum := rand.Intn(10) + 1 //int
        fmt.Println(randNum)
        time.Sleep(time.Duration(randNum) * time.Second) //duration 持续
        fmt.Println("睡醒了")
    
    
    }
    
    

    相关文章

      网友评论

          本文标题:

          本文链接:https://www.haomeiwen.com/subject/sqdbehtx.html