zoukankan      html  css  js  c++  java
  • Go_13:Go常用功能总结一阶段

    1. go语言从键盘获取输入内容

      <1. 最简单的办法是使用 fmt 包提供的 Scan 和 Sscan 开头的函数。请看以下程序:

    package main
    import "fmt"
    
    var (
        firstName, lastName, s string
        i int
        f float32
        input = "56.12 / 5212 / Go"
        format = "%f / %d / %s"
    )
    
    func main() {
        fmt.Println("Please enter your full name: ")
        fmt.Scanln(&firstName, &lastName)
        fmt.Printf("Hi %s %s!
    ", firstName, lastName)
        fmt.Sscanf(input, format, &f, &i, &s)
        fmt.Println("From the string we read: ", f, i, s)
    }

    键盘输入:liang yongxing,输出结果如下所示:

    Hi liang yongxing!
    From the string we read:  56.12 5212 Go
    

      Scanln 扫描来自标准输入的文本,将空格分隔的值依次存放到后续的参数内,直到碰到换行。Scanf 与其类似,除了 Scanf 的第一个参数用作格式字符串,用来决定如何读取。Sscan 和以 Sscan 开头的函数则是从字符串读取,除此之外,与 Scanf 相同。如果这些函数读取到的结果与您预想的不同,您可以检查成功读入数据的个数和返回的错误。

      <2. 也可以使用 bufio 包提供的缓冲读取(buffered reader)来读取数据,正如以下例子所示:

    package main
    import (
        "fmt"
        "bufio"
        "os"
    )
    
    var inputReader *bufio.Reader
    var input string
    var err error
    
    func main() {
        inputReader = bufio.NewReader(os.Stdin)
        fmt.Println("Please enter some input: ")
        input, err = inputReader.ReadString('
    ')
        if err == nil {
            fmt.Printf("The input was: %s
    ", input)
        }
    }

      inputReader 是一个指向 bufio.Reader 的指针。inputReader := bufio.NewReader(os.Stdin) 这行代码,将会创建一个读取器,并将其与标准输入绑定。

      bufio.NewReader() 构造函数的签名为:func NewReader(rd io.Reader) *Reader

      该函数的实参可以是满足 io.Reader 接口的任意对象,函数返回一个新的带缓冲的 io.Reader 对象,它将从指定读取器(例如 os.Stdin)读取内容。返回的读取器对象提供一个方法 ReadString(delim byte),该方法从输入中读取内容,直到碰到 delim 指定的字符,然后将读取到的内容连同 delim 字符一起放到缓冲区。

      ReadString 返回读取到的字符串,如果碰到错误则返回 nil。如果它一直读到文件结束,则返回读取到的字符串和 io.EOF。如果读取过程中没有碰到 delim 字符,将返回错误 err != nil。在上面的例子中,我们会读取键盘输入,直到回车键( )被按下。

    2. go语言字符串比较

      go语言中,判断两个字符串是否相等,用

      strings.EqualFold(str1, str2)
    

      比较两字符串

      strings.Compare(a, b string) int
    

       判断是否包含

      strings.Contains(s, substr string) bool
    

       将数组按照指定的字符合并为字符串

      strings.Join(a []string, sep string) string
    

       将字符串按照指定字符进行切割为数组

      strings.Split(s, sep string) []string

       还有很多其他的,例如我们常用的转位大写、小写、驼峰式;去掉空格、替换等,这些函数在go语言也都是存在的,如果需要请查看响应的文档。

    3. go语言获取时间

     1. 获取当前时间时间戳

    fmt.Println(time.Now().Unix())
    # 1492506479
    

      如果想要获取精确到毫秒级别的时间戳即精确到 13 位,Go 语言中没有直接的方法,可以使用得到纳秒级别的时间戳,之后除以 1000000 之后得到毫秒级别,即如下代码:

    time.Now().UnixNano() / 1000000
    

     2. 获取当前标准时间,格式:yyyy-MM-dd HH:mm:ss

    fmt.Println(time.Now().Format("2006-01-02 15:04:05"))  // 这是个奇葩,必须是这个时间点, 据说是go诞生之日, 记忆方法:6-1-2-3-4-5
    # 2017-04-18 17:10:25
    

      3. 时间戳转str格式的时间

    str_time := time.Unix(1389058332, 0).Format("2006-01-02 15:04:05")
    fmt.Println(str_time)
    # 2017-04-18 17:10:25
    

      4. str格式时间转时间戳

    the_time, err := time.Parse("2006-01-02 15:04:05", "2017-04-18 17:10:25")
    if err == nil {
            unix_time := the_time.Unix()
    	fmt.Println(unix_time)	
    }
    # 1492506479
    

    4. golang 中的缓冲应用

      bytes.buffer是一个缓冲byte类型的缓冲器存放着都是byte。Buffer 是 bytes 包中的一个结构体: type Buffer struct{…}

      底层原理:其实底层就是一个 []byte, 字节切片

      创建 Buffer缓冲器的几种方式:

      1. 初始化应用

      var buffer bytes.Buffer                // 直接定义一个 Buffer 变量,而不用初始化
      buffer.Writer([]byte("Hello World!"))  // 可以直接使用

      2. 使用 new 初始化

      buffer := new(bytes.Buffer)     //直接使用 new 初始化,可以直接使用 

      3. 传入字节数组创建

      buffer := NewBuffer([]byte{"hello"})

      4. 传入字符串创建

      buffer := bytes.NewBufferString("helloWorld")

      Buffer既可以被读也可以被写。如果是读Buffer,buf需填充一定的数据;如果是写,buf需有一定的容量(capacity),当然也可以通过new(Buffer)来初始化Buffer。另外一个方法NewBufferString用一个string来初始化可读Buffer,并用string的内容填充Buffer.

    import (
        "bytes"
        "fmt"
        "testing"
    )
    
    func TestBufferString(t *testing.T){
        buf1:=bytes.NewBufferString("swift")
        buf2:=bytes.NewBuffer([]byte("swift"))
        buf3:=bytes.NewBuffer([]byte{'s', 'w', 'i', 'f', 't'})
        fmt.Println("===========以下buf1,buf2,buf3等效=========")
        fmt.Println("buf1", buf1)
        fmt.Println("buf1", buf2)
        fmt.Println("buf1", buf3)
        fmt.Println("===========以下创建空的缓冲器等效=========")
        buf4:=bytes.NewBufferString("")
        buf5:=bytes.NewBuffer([]byte{})
        fmt.Println("buf4:", buf4)
        fmt.Println("buf5:", buf5)
    }

    运行结果如下:

    ===========以下buf1,buf2,buf3等效=========
    buf1 swift
    buf1 swift
    buf1 swift
    ===========以下创建空的缓冲器等效=========
    buf4: 
    buf5: 

    写入数据的三种方式:

    //write string
    buffer.WriteString("abc")
    //write []byte
    buffer.Write([]byte("abc"))
    buffer.Write(byte{'a', 'b', 'c'})
    //write byte
    buffer.WriteByte('c')

    5. 接口转换为字符串即interface{}-->string

    var a interface{}
    var b string = a.(string)

      其中 b 就是通过接口 a 转换而来。

    5. string、int、int64相互转化

    #string --> int  
    int,err:=strconv.Atoi(string)  
    
    #string --> int64  
    int64, err := strconv.ParseInt(string, 10, 64)  
    
    #int --> string  
    string:=strconv.Itoa(int)  
    
    #int64 --> string  
    string:=strconv.FormatInt(int64,10)

    6. append 使用时犯的错

      注意:append 是给已有数组追加数据的,但是新手常常是这么做的:函数初始化时 new 了一个新的数组并赋予了一定长度,之后直接就将新产生的数据 append 到数组中;这样做会导致初始化长度的那些位置都为空,在进行下一步操作的时候会发生问题。

      结论:申明 array 大小后,千万不要使用 append 来赋值,因为它是直接在 array 后追加数据的,相当于前面有 arrayLength 个空值

      使用 append 一般都是给 slice 或空数组,且不确定数组大小的情形下使用。如果明确知道数组大小,强烈建议使用一定大小的数组,通过下标进行赋值,因为这样速度会很快。

  • 相关阅读:
    通过CMMI5的国内企业有几个?这个认证是不是很牛啊?
    CNUTCon 全球运维技术大会2017
    新浪微博基于Docker的混合云架构与应用实践-DockerInfo
    k8s~为服务添加ingress的实现
    springboot~HttpPut开启application/x-www-form-urlencoded
    K8s~为pod添加sidecar进行日志收集
    k8s~部署EFK框架
    springboot~Transactional注解的注意事项
    CentOS 6.4 快速安装Nginx笔记
    去掉NSString中的HTML标签
  • 原文地址:https://www.cnblogs.com/liang1101/p/6693041.html
Copyright © 2011-2022 走看看