• golang入门字符串, string与int等基础数据类型之间的转换, string与[]byte, []rune之间的关系


    package main

    import (
    "bytes"
    "fmt"
    "reflect"
    "strconv"
    "strings"
    )

    func testString() {
    var tString string

    //对于golang, string没有nil概念, tString = nil 和 tString == nil 这两种写法不能通过编译
    fmt.Println(tString == "") //true
    fmt.Println(len(tString) == 0) //true
    fmt.Printf("address=%p ", &tString)

    tString = "hello,中国" //字符串是不可变的
    fmt.Printf("tString len = %d ", len(tString)) //结果为 12, go中string的底层实现是[]byte, 所以string的len是按照字符串的byte数组的长度计算的, 一个中文字符占3个byte
    fmt.Printf("first byte = %c ", tString[0]) //可以通过下标访问字节, 但不能修改
    s := tString[0:] //这种操作要慎用, 每一次转换都需要复制内容, 并且切片(s)和原字符串(tString)所指向的底层字符数组是一个
    fmt.Println(reflect.TypeOf(s)) //结果为string, 字符串的切片操作, 这里要注意返回的仍然是字符串, 而不是slice

    rString := []rune(tString) //如果想访问中文, 可以用rune类型
    fmt.Printf("tString char 7 = %c ", rString[7]) //国
    fmt.Printf("tString char len = %d ", len(rString)) //结果为 8
    //byte实质上是uint8类型, rune实质上是uint32类型

    //字符串拼接, 出于效率上的考虑, 如果是少量的拼接,使用哪种都可以, 但如果有大量的字符串拼接, 性能要求较高的场合, 那么选择选择合适的拼接方式就显得很重要
    tString = "hello" + "," + "world" // 直接使用运算符 "+" 链接, 因为每次运算都会产生新的字符串,空间和gc不太友好, 优点在于简洁清晰
    tString = fmt.Sprintf("%s%s%d", "hello ", "world", 5) //fmt格式化, 逻辑复杂, 几种拼接方式中, 效率基本是最低的, 优点可以格式化其他的类型
    tString = strings.Join([]string{"hello", "world"}, ":") //strings拼接, 优点在 如果已有一个字符串数组效率很高, 但如果是重新构造的话, 代价也不小
    buffer := bytes.Buffer{} //bytes.Buffer, 适用于大量的拼接,性能要求较高的场景
    buffer.WriteString("hello")
    buffer.WriteString("world")
    fmt.Println(buffer.String())
    fmt.Println(tString)

    //字符串的更多操作(截取, 分割, 比较, 索引, 前后缀等)strings
    fmt.Println(strings.Contains(tString, "中"))

    //字符串与基础数据类型的转换在strconv包
    iString := "5"
    i, _ := strconv.Atoi(iString) //字符串转int
    strconv.Itoa(i) //int转string
    ui, _ := strconv.ParseInt(iString, 10, 8) //第一个参数是需要转换的字符串, 第二个是进制(二进制, 八进制...), 第三个是bit大小(int8,int16...)

    //ParseFloat, ParseUint, ParseBool分别是字符串转换浮点, uint, 布尔类型.
    //基础类型转换成string有Format
    strconv.FormatInt(ui, 10)
    strconv.FormatBool(true)
    //字符串操作的包是strings, 比较, 前后缀, 去空格, 切分, 大小写转换...

    }

    func main() {

    testString()

    }
  • 相关阅读:
    30个php操作redis经常用法代码样例
    Android语音播报、后台播报、语音识别
    Gym 100733J Summer Wars 题解:灵活运用扫描线的思想
    如何运营一个软件微社区
    关于迭代测试的一些思考
    DirectUI界面编程(五)WindowImplBase的使用
    Zxing实现在线二维码生成程序
    Java二维码生成与解码工具Zxing使用
    DirectUI界面编程(四)界面布局详解
    软件开发中的资源管理
  • 原文地址:https://www.cnblogs.com/-xuzhankun/p/10491217.html
Copyright © 2020-2023  润新知