• Go - 基本数据类型和其字符串表示之间转换


    1. 基本数据类型和其字符串表示之间转换

    基本类型的值,都有一个字符串表示,如数字类型值1 字符串表示为 "1",字符的编码为Unicode或者UTF-8,数字的编码是 int,底层存储的数据格式本质上不一样,基本类型的转换本质上只是文法语义上的转化

    1.1 Go 语言基本类型

    • 整数 : 有符号int int8 int16 int32 int64 无符号: uint uint8 uint16 uint32 uint64
    • 小数:float32 flat63
    • 字符串: string

    1.2 转换过程中可能得错误

    基本数据类型到字符串表示的转换,不会出错,但字符表示到基本类型的转换可能会有以下错误

    1. 超出目标类型的表示范围
    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	numStr := "400"
    	// 400 数字值已经超出int8(-128, 127)类型表示的范围
    	num, err := strconv.ParseInt(numStr, 10, 8)
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	fmt.Println("conv result:", num)
    }
    
    // 输出:strconv.ParseInt: parsing "400": value out of range
    
    
    1. 不符合目标类型语法
    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	numStr := "xx"
    	// xx字符串值无法表示为对应的整数值
    	num, err := strconv.ParseInt(numStr, 10, 8)
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	fmt.Println("conv result:", num)
    }
    
    // 输出:strconv.ParseInt: parsing "400": value out of range
    

    2. 转换

    • 字符串与带引号之间转化
    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	name := "dream_fish n"
    	// 添加上引号
    	fmt.Println("result:", strconv.Quote(name))
    
    	// 去除引号
    	school := `"University"`
    	school_, err := strconv.Unquote(school)
    	if err != nil {
    		fmt.Println("err:", err)
    		return
    	}
    	fmt.Println("result:", school_)
    }
    
    
    • 字符串与布尔类型之间的转换

    字符串转bool类型

    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	// 包含所有可以转bool类型的值
    	boolStringValues := []string{"1", "0", "t", "f", "true", "false", "True", "False"}
    
    	// 进行转换
    	for _, b := range boolStringValues {
    		result, err := strconv.ParseBool(b)
    		if err != nil {
    			fmt.Printf("parse value: %s err:%s\n", b, err)
    			continue
    		}
    		fmt.Printf("parse value: %s err:%s\n", b, result)
    	}
    	
    	
    }
    
    

    bool类型转字符串

    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	// 包含布尔类型的值
    	boolValues := []bool{false, true}
    
    	// 进行转换
    	for _, b := range boolValues {
    		result := strconv.Quote(strconv.FormatBool(b))
    		fmt.Printf("format value: %t err:%s\n", b, result)
    	}
    }
    
    
    • 数值与字符串之间的转换

    字符串转数值

    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	// 转换为 int8类型
    	int8String := "122"
    	// 第一个参数是需要转换的字符串,第二个参数是int类型的进制,第三个参数是bit位数
    	intNum, err := strconv.ParseInt(int8String, 10, 8)
    	if err != nil {
    		fmt.Println("err:", err)
    	}
    	fmt.Println("int8 num:", intNum)
    
    	// 字符串正整数
    	uintNum, err := strconv.ParseUint(int8String, 10, 8)
    	if err != nil {
    		fmt.Println("err:", err)
    	}
    	fmt.Println("uint8 num:", uintNum)
    
    	// 字符串转浮点数
    	floatNumStr := "67.9"
    	floatNum, err := strconv.ParseFloat(floatNumStr, 64)
    	if err != nil {
    		fmt.Println("err:", err)
    	}
    	fmt.Println("float64 num:", floatNum)
    }
    
    

    数值转字符串

    • strconv包的Format系列方式
    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	// 整肃转字符串
    	intNum := int64(8)
    	fmt.Printf("%s\n", strconv.FormatInt(intNum, 10))
    
    	// 浮点数转字符串
    	result := strconv.FormatFloat(88.9, 'f', 2, 64)
    	fmt.Println("float to str:", result)
    
    	// bool类型转字符串
    	fmt.Println("bool to str:", strconv.FormatBool(true))
    
    	// 无符号整肃
    	fmt.Println("uint to str", strconv.FormatUint(111, 10))
    }
    
    
    • fmtSprint系列方式
    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	// 整肃转字符串
    	intValue := int64(8)
    	boolValue := true
    	floatValue := 44.2
    	uintValue := 33
    
    	result := fmt.Sprintf("int: %d, bool: %t, float: %f, unit: %d", intValue, boolValue, floatValue, uintValue)
    	fmt.Printf(result)
    }
    
    • strconv包的AtoiItoa方法,其实是 ParseInt(s, 10, 0) FormatInt(i, 10)的简写
    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	// int类型值转换为字符串
    	result := strconv.Itoa(100)
    	fmt.Println(result)
    
    	// 字符串值换换为int类型的值
    	intString := "200"
    	intValue, err := strconv.Atoi(intString)
    	if err != nil {
    		panic(err)
    	}
    	fmt.Println(intValue)
    }
    
    

    3. Append系方法

    添加转成基本类型转换成字符串表示的

    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	// 基础数据类型
    	intValue := int64(100)
    	boolValue := true
    	floatValue := 5.4
    
    	buf := []byte("result:")
    	resultValue := strconv.AppendFloat(buf, floatValue, 'f', 2, 64)
    	fmt.Println(string(resultValue))
    
    	resultValue = strconv.AppendInt(buf, intValue, 10)
    	fmt.Println(string(resultValue))
    
    	resultValue = strconv.AppendBool(buf, boolValue)
    	fmt.Println(string(resultValue))
    }
    
    

    4. 总结

    • Parse系列方法,将字符串表示尝试转换为基础类型,Formation系列方法将基本类型转换为字符串表示,Append方法是一个将基本类型的字符串表示添加到字节切片的快捷方式
  • 相关阅读:
    第三十三章 管理许可(六)
    window电脑关闭docker中正在运行redis的 RDB 和AOF 持久化选项
    Java常用的设计模式,如单例模式、工厂模式、观察者模式等
    《QT从基础到进阶·三十》QVariant的基础用法
    Hazel引擎学习(九)
    盘点60个Python各行各业管理系统源码Python爱好者不容错过
    Android 13.0 Launcher3定制之双层改单层(去掉抽屉式四)
    AB Test实验设计
    KUKA机器人中断编程2—中断相关的指令
    卷积神经网络(CNN)的组成结构以及其优点
  • 原文地址:https://www.cnblogs.com/2bjiujiu/p/17992258