zoukankan      html  css  js  c++  java
  • GO学习之 常用系统函数_字符串相关函数_时间函数_内置函数

    .常用的字符串函数

    后面的一些需要导入strings

    //(1)统计字符串的长度,按字节len(str)
    package main
    
    import "fmt"
    
    func main() {
    
        // 统计字符串的长度,按字节
        // 一个英文字母占用一个字节
        // utf8中一个中文编码一个字符三个字节
        str := "hello东"
        fmt.Println("str len=",len(str))  // 8
    }
    
    //(2)字符串变量,同时处理有中文的问题 r :[] rune(str)
        str2 := "hello深圳"
        // 有中文的话,需要转rune
        str3 := []rune(str2)
        for i := 0; i < len(str3); i++ {
            fmt.Printf("字符=%c
    ",str3[i])
        }
    //(3)字符串转整数: n.err = stronv.Atoi(“123”)
        // 字符串转整数:n,err := strconv.Atoi("12")
        n, err := strconv.Atoi("123")
        if err != nil{
            fmt.Println("转换错误",err)
        } else {
            fmt.Println("转成的结果是",n)
        }
    //(4)整数转字符串: str = strconv.Itoa(“hello”)
        // 整数转字符串
        str4 := strconv.Itoa(12345)
        fmt.Printf("str=%v, str_type=%T",str4,str4)
    //(5)字符串转byte
        // 字符串转byte
        var bytes = []byte("hello go")
        fmt.Printf("bytes=%v
    ",bytes)
    //(6)byte转字符串
        // byte 转字符串
        str5 := string([]byte{97, 98, 99})
        fmt.Println("str5=", str5)
    
    //(7)10 进制转 2,8,16进制
        // 10 进制转 2,8,16进制  返回对应的字符串
        str6 := strconv.FormatInt(123, 2)
        fmt.Printf("123对应的二进制是=%v
    ",str6)
        str7 := strconv.FormatInt(123,8)
        fmt.Printf("123对应的8进制是=%v
    ",str7)
        str8 := strconv.FormatInt(123,16)
        fmt.Printf("123对应的16进制是=%v
    ",str8)
    
    //(8)查找子串是否在指定的字符串中
    需要导入strings
        // 查找子串是否在指定的字符串中
        is_in := strings.Contains("hszllo","llo")
        fmt.Println("是否存在",is_in)
    
    //(9)统计一个字符串中有几个指定的子串
        // 统计一个字符串中有几个指定的子串
        num := strings.Count("hahahahahhahah", "ha")
        fmt.Printf("出现%v次",num)
    
    //(10)不区分大小的字符串比较(==是字母大小写的)
        // 不区分带小写比较
        is_eq := strings.EqualFold("ASD","asd")
        fmt.Println("是否相同",is_eq)
    
    //(11)返回子串在字符串中第一个出现的index值,如果没有返回-1
        // 返回子串Index值
        index := strings.Index("NNN_ABC","ABC")
        fmt.Println("返回index=",index)
    
    //(12)返回子串最后一次出现的index,如果没有返回-1
        // 返回子串最后一次出现的index,如果没有返回-1
        index_02 := strings.LastIndex("go go go goLang","go")
        fmt.Println("最后一次出现index=",index_02)
    //(13)字符串的替换
    strings.Replace(“hello go go go”,”go”,”go 语言”,n) 
    n 可以指定希望替换几个,如果n=-1表示全部替换
    
        //字符串的替换
        rp_str := strings.Replace("hello go go go","go","go 语言",3) 
        fmt.Println("替换后的结果:",rp_str)
    
    //(14)字符串的分割,才分为字符串数组
    
        // 字符串的分割,才分为字符串数组
        strArr := strings.Split("hello,world,ok",",")
        fmt.Println("strArr=",strArr)
        // 遍历数组
        for i := 0 ; i <len(strArr); i++ {
            fmt.Println(strArr[i])
        }
    
    
    //(15)字符串中的带小写转换
        // 字符串中的带小写转换
        // strings.ToLower("GO")
        // strings.ToUpper("go")
        res1 := strings.ToLower("GO")
        fmt.Println("变成小写:",res1)
        res2 := strings.ToUpper("go")
        fmt.Println("变成大写:",res2)
    //(16)字符串左右空格去掉
    
        // 字符串左右空格去掉
        new_str_01 := strings.TrimSpace("  hello go !   ")
        fmt.Println("去掉空格的:",new_str_01)
    //(17)字符串去掉左右两边的字符串
        // 去掉左右两边指定的字符串
        new_str_02 := strings.Trim("!!hello go !!","!!")
        fmt.Println("去掉左右两边指定的!:",new_str_02)
    
    //(18)字符串去掉左边指定字符串
         // 去掉左边指定的字符串
        new_str_03 := strings.TrimLeft("!!hello go !   ","!!")
        fmt.Println("去掉左边指定的!:",new_str_03)
    
    //(19)字符串去掉右边指定的字符串
        // 去掉右边指定的字符串
        new_str_04 := strings.TrimRight("!!hello go !!","!!")
        fmt.Println("去掉右边指定的!:",new_str_04)
    
    //(20)判断字符串是否以指定的字符串开头
        // 判断字符串是否以指定的字符串开头
        is_start := strings.HasPrefix("ftp://127.0.0.1","ftp")
        fmt.Println("是否为ftp开头:",is_start)
    
    //(21)判断字符串是否以指定的字符串结尾
        // 判断字符串是否以指定的字符串结尾
        is_end := strings.HasSuffix("www.baidu.com","com")
        fmt.Println("是否为com结尾:",is_end)
    

      

    .常用的时间与日期函数

    时间和日期相关函数,需要导入time

    1.time.Time 时间类型

    例:

    package main
    
    import (
        "fmt"
        "time"
    )
    
    func main() {
        // 日期和时间相关函数与方法的使用
        // 1.获取当前时间
        now := time.Now()
        fmt.Printf("当前时间为:now=%v
    时间类型为:time_type=%T
    ",now,now)
        // 打印结果:
        // 当前时间为:now=2020-03-15 17:59:06.3353254 +0800 CST m=+0.002996901
        // 时间类型为:time_type=time.Time
    
        // 通过now获取到年月日,时分秒
        fmt.Printf("年=%v
    ",now.Year())
        fmt.Printf("月=%v  %v
    ",now.Month(),int(now.Month())) // 英文的  数字加int强转
        fmt.Printf("日=%v
    ",now.Day())
        fmt.Printf("时=%v
    ",now.Hour())
        fmt.Printf("分=%v
    ",now.Minute())
        fmt.Printf("秒=%v
    ",now.Second())
        fmt.Printf("周=%v
    ",now.Weekday())
    }
    

    2.格式化日期和时间

    方式一:

    例:

    port (
        "fmt"
        "time"
    )
    
    func main() {
        // 格式化日期时间
        now := time.Now()
        fmt.Printf("当前年月日 时分秒 %02d-%02d-%02d %02d:%02d:%02d
    ",
        now.Year(),now.Month(),now.Day(),
        now.Hour(),now.Minute(),now.Second())
        dateStr := fmt.Sprintf("当前年月日 时分秒 %02d-%02d-%02d %02d:%02d:%02d
    ",
        now.Year(),now.Month(),now.Day(),
        now.Hour(),now.Minute(),now.Second())
        fmt.Printf("%v %T",dateStr,dateStr)
    
    }
    

    方式二:使用time.Format("2006/01/02 15:04:05")

    例:

    package main
    
    import (
        "fmt"
        "time"
    )
    
    func main() {
        // 格式化日期时间
        now := time.Now()
        // "2006/01/02 15:04:05" 这个字符串的各个数字是固定的,必须是这样写
        // "2006/01/02 15:04:05" 这个字符串各个数字可以自由的组合,这样可以按程序需求来返回时间和日期
        fmt.Println(now.Format("2006/01/02 15:04:05"))
        // 只输出年月日
        fmt.Println(now.Format("2006/01/02"))
        // 只输出时分秒
        fmt.Println(now.Format("15:04:05"))
    }
    

    3.时间的常量

    const(

    Nanosecond Duration = 1 // 纳秒

    Microsecond = 1000 * Nanosecond Duration  // 微秒

    Millisecond  = 1000* Microsecond     // 毫秒

    Second     = 1000*Millisecond     //

    Minute     = 60 * Second   // 分钟

    Hour       = 60* Minute    // 小时

    )

    常量的作用:在程序中可用于获取指定时间单位的时间,比如想得到100毫秒 100 * time.Millisecond

    休眠:

    time.Sleep(1000*time*Millisecond)   // 休眠100毫秒

    例:

      i := 0
        for {
            i ++
            fmt.Println(i)
            time.Sleep(time.Second)
            if i >= 10 {
                break
            }
        }
    

    4.获取unix时间戳和unixnano时间戳

    作用是可以获取随机的数字

    197011000秒 到现在的时间

    例子:

    package main
    
    import "fmt"
    import "time"
    
    func main() {
        now := time.Now()
        // Unix 和 UnixNamo
        fmt.Printf("uinx时间戳=%v 
    unixnano时间戳=%v",now.Unix(),now.UnixNano())
    
    }
    

    例:计算程序运行时间

    package main
    
    import "fmt"
    import "strconv"
    import "time"
    
    func test() {
        str := ""
        for i := 0 ; i < 100000; i++ {
            str += "hello" + strconv.Itoa(i)
        }
    }
    
    func main() {
        start := time.Now().Unix()
        test()
        end := time.Now().Unix()
        fmt.Printf("执行程序耗费时间为%v秒",end-start)  
    }
    

    三.内置函数builtin

    Golang设计者为了编程方便,提供了一些函数,这些函数可以直接使用,我们称为GO的内置函数。

    文档:https://studygolang.com/pkgdoc  -> builtin

    1.len

    用来求长度,比如:string,array,slice,map,channel

    2.new

    用来分配内存,主要用来分配值类型,比如int,float32,struct...返回的是指针

    举例:

    package main
    
    import "fmt"
    
    func main() {
        //
        num1 := 100
        fmt.Printf("num1的类型%T,num1的值=%v,num1的地址%v
    ",num1,num1,&num1)
    
        num2 := new(int)  // num2是指针
        // 指针的值是一个地址
        // num2 的类型%T => *int
        // num2 的值 = 地址 0xc0000540a0
        // num2的地址 = 0xc000080020
        
        // 修改num2 指向的的值
        *num2 = 100
        fmt.Printf("num2的类型%T,num2的值=%v,num2的地址%v 指向的值=%v
    ",num2,num2,&num2,*num2)
    
    }
    

    3.make

    用来分配内存,主要用来分配引用类型,比如channelmapslice

    4.错误处理

    默认情况下代码逻辑或语法错误,会报错。

    如果让报错跳过继续运行就需要使用到错误处理机制。

    基本说明:

    1GO语言追求简洁优雅,所有,GO语言不支持传统的try...catch..finally java)这种处理

    2GO中引入的处理方式为:defer,panic,recover

    3GO中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。

    举例:defer + recover

    package main
    
    import "fmt"
    
    func test() {
        // 使用defer + recover 来捕获和处理异常
        defer func() {
            err := recover()  //内置函数recover可以捕获到异常
            if err != nil {  // 说明捕获到异常或错误
                fmt.Println("err=",err)
            }
        }()
        num1 := 10
        num2 := 0
        res := num1 / num2
        fmt.Println("res=",res)
    }
    
    func main() {
        // 
        test()
        // 下面的代码正常指向
        fmt.Println("test() 后运行的")
    }
    

    错误处理的好处:

    进行错误处理后,程序不会轻易挂掉,如果加入预警代码,就可以让程序更加的健壮。

    自定义错误

    GO程序中,也支持自定义错误,使用errors.Newpanic内置函数。

    1errors.New(“错误说明”),会返回一个error类型的值,表示一个错误

    2panic内置函数,接收一个interface{} 类型的值(也就是任何值),作为参数。可以接收error类型的变量,输出错误信息,并退出程序。

    举例:自定义错误

    package main
    
    import (
        "errors"
        "fmt"
    )
    
    // 函数去读取以配置文件init.conf的信息
    // 如果文件名传入不正确,我们就返回一个自定义的错误
    func readConf(name string) (err error) {
        if name == "config.ini" {
            // 读取
            return nil
        } else {
            // 返回一个自定义错误
            return errors.New("读取文件错误...")
        }
    }
    
    func test() {
        err := readConf("config.ini2") // 看传的文件名是否正确,不正确就报错
        if err != nil {
            // 如果读取文件发送错误,就输出这个错误,并终止程序
            panic(err)
        }
        fmt.Println("test继续执行")
    }
    
    func main() {
        // 自定义错误的使用
        test()
        fmt.Println("运行main()后面的代码")
    }
    
  • 相关阅读:
    Codeforces 22E(图论)
    Codeforces Educational Round 23
    bzoj1444 有趣的游戏(AC自动机+概率dp)
    AtCoder Grand Contest 012 D Colorful Balls
    计蒜客15430 XOR Queries(Trie处理位运算问题)
    AtCoder Grand Contest 012 B Splatter Painting(记忆化搜索)
    Codeforces 799E(贪心)
    Codeforces Round #414
    Codeforces Educational Round 21
    LOJ10078
  • 原文地址:https://www.cnblogs.com/hszstudypy/p/13081437.html
Copyright © 2011-2022 走看看