美文网首页
golang基本用法速查

golang基本用法速查

作者: wildsre | 来源:发表于2020-02-11 22:11 被阅读0次

    Hello World!

    package main
    
    import "fmt"
    
    func main() {
       fmt.Println("Hello World!") 
    }
    

    引入模块

    引入内置模块

    //单个引入
    import "fmt"
    
    //引入多少个
    import (
        "fmt"
        "os"
    )
    

    引入第三方模块

    • 规则: 默认从 GOPATH 下 src 目录开始找
    • import 的路径到目录终止, 不会到文件, 每个目录就是一个模块, 一般最终目录名即模块名
    • 默认的模块名由 go 文件首行 package 定义, 多个 go 文件的 package 可以相同, 同一模块的 go 文件应该放置于同一个目录
    • 模块可以使用别名
    • 通过 govendor 可以方便进行项目迁移
    import (
        "github.com/wildsre/arc/arc"
        arcModel "github.com/wildsre/arc/model"
        "github.com/wildsre/arc/router"
    )
    

    变量初始化

    基本变量初始化

        var x int
        var (
            i int
            j float64
            k, z string
        )
        v := "test"
    

    数组&切片初始化

    初始化后, 长度和容量都相等, 数组初始化完后就已经分配所有长度的内存, 切片在使用append扩容后, cap会与len不等

        //初始化定长数组
        arr := [3]int{1,23} //len: 3, cap: 3 
        s := []int{1,3}     //len:2, cap:2
        //初始化定长切片
        slice := make([]int, 3)
    

    映射初始化

    • 常规初始化
        //方式1: 先声明, 后赋值, 声明后m为nil指针
        var m map[string]string
        m = make(map[string]string)
        m["k1"] = "v1"
        //方式2
        m2 := map[string]string{"k1":"v1", "k2":"v2"}
    
    • 嵌套映射初始化
        m2 := map[string][]int{"k1":{1,2}, "k2":{1,1}}
        m3 := map[string]map[string]string{"k1":{"k11":"v1"}}
    

    结构体初始化

        //匿名结构体
        s1 := struct {
            Att1 string
            Att2 int
        }{"a", 1}
    
        //先定义再初始化
        type Foo struct {
            A1 string
            A2 []int
        }
    
        //初始化需要注意, 前后括行不能为空 
        // Foo:{
        //    "a", 
        //    []int{1,2} 
        // } 会报错
        s2 := Foo{ "a",
            []int{1,3} }
    
        //初始化部分变量
        s3 := Foo{ A1: "s" }
    

    控制语句

    循环

        for i:=0; i<2; i++ {
            fmt.Println(i)
        }
    

    判断

        if i<0 {
            fmt.Println("one")
        } else if i>=0 && i<3 {
            fmt.Println("two")
        } else {
            fmt.Println("three")
        }
    

    数据类型转换

    string 和 bytes

        s1 := "test 测试"
        //string to bytes
        b1 := []byte(s1)
    
        //bytes to string
        s2 := string(b1)
    

    string 和 数字

        import "strconv"
        s1 := "2001"
        //string to int
        i1, e := strconv.Atoi(s1)
        
        //int to string
        s2 := strconv.Itoa(i1)
    
        s3 := "3.1415"
        //string to float
        f1, e := strconv.ParseFloat(s3, 64)
    
        //float to string
        s4 := fmt.Sprintf("%.3f", f1)
    

    json 的处理

    import "encoding/json"
    
    type UserData struct {
        UserName string `json:"username"`
        Token string `json:"token"`
        DefaultSpace string `json:"default-space"`
        Space map[string]string `json:"space"`
    }
    
    txt := `{
        "username":"foo", 
        "token": "a123", 
        "default-space": "foo", 
        "space": {"foo":"bar"}
    }`
    ud := new(UserData)
    
    //json字符串转对象, 参数2需要为指针
    e := json.Unmarshal([]byte(txt), ud)
    
    //对象转json字符串
    txt2, e := json.Marshal(ud)
    

    时间-日期处理

        import "time"
    
        //获取当前时间, Time结构体
        now := time.Now()
    
        //格式化时间, layout只能为固定格式
        fnow := now.Format("2006-01-02 15:04:05.000")
        fmt.Println(fnow)
    
        //时间戳(秒,纳秒)
        fmt.Println(now.Unix())
        fmt.Println(now.UnixNano())
    
        //解析时间字符串, 时区?
        last, e := time.Parse("2006-01-02T15:04:05.000", "2020-02-29T15:33:40.312")
        fmt.Println(last, e)
    
        //时间运算: 5分钟前(毫秒到小时: ms, s, m, h)
        d5, _ := time.ParseDuration("-5h")
        last5 := last.Add(d5)
        fmt.Println(last, last5)
    
        //时间运算: 两时间差
        d2 := now.Sub(last)
        fmt.Println(d2.String())
    
    //时间格式
    const (
        ANSIC       = "Mon Jan _2 15:04:05 2006"
        UnixDate    = "Mon Jan _2 15:04:05 MST 2006"
        RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"
        RFC822      = "02 Jan 06 15:04 MST"
        RFC822Z     = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
        RFC850      = "Monday, 02-Jan-06 15:04:05 MST"
        RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"
        RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
        RFC3339     = "2006-01-02T15:04:05Z07:00"
        RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
        Kitchen     = "3:04PM"
        // Handy time stamps.
        Stamp      = "Jan _2 15:04:05"
        StampMilli = "Jan _2 15:04:05.000"
        StampMicro = "Jan _2 15:04:05.000000"
        StampNano  = "Jan _2 15:04:05.000000000"
    )
    

    文件读写

    https://www.jianshu.com/p/7790ca1bc8f6

    import (
        "os"
        "ioutil"
    )
    

    读文件

    const (
            // Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified.
            O_RDONLY int = syscall.O_RDONLY // open the file read-only.
            O_WRONLY int = syscall.O_WRONLY // open the file write-only.
            O_RDWR   int = syscall.O_RDWR   // open the file read-write.
            O_APPEND int = syscall.O_APPEND // append data to the file when writing.
            O_CREATE int = syscall.O_CREAT  // create a new file if none exists.
            ...
    )
    
    //               文件名      模式                               权限
    f := os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
    
    //f.Read([]byte), Read方法读取指定长度的字节, 一般我们会读取被打开文件的所有内容
    //使用 ioutil.ReadAll 获取全部内容
    //使用 ReadAll 接口要求参数 f 需要有 Read(b []byte) (n int, err error) 接口
    txt, err := ioutil.ReadAll(f)
    
    //只读取文件
    txt, err := ioutil.ReadFile("test.txt")
    

    写文件

    f.Write([]byte("hello."))
    

    压缩-解压gzip文件例子

    import (
        "os"
        "io/ioutil"
        "compress/gzip"
    )
    
    //使用gzip压缩二进制文件
    srcBin, err := ioutil.ReadFile("test.bin")
    dstGz, err := os.OpenFile("test.gz", os.O_CREATE|os.O_WRONLY, 0644)
    gzHandle := gzip.NewWriter(dstGz)
    gzHandle.Write(srcBin)
    
    //解压gzip文件
    srcGz, err := os.Open("test.gz")
    dstBin, err := os.Open("test.bin", os.O_CREATE|os.O_WRONLY, 0755)
    gzHandle, err := gzip.NewReader(srcGz)
    content, err := ioutil.ReadAll(gzHandle)
    dstBin.Write(content)
    

    函数

    协程

    相关文章

      网友评论

          本文标题:golang基本用法速查

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