Golang语言基本数据类型默认值及字符串之间互相转换案例

简介: 这篇文章讲解了Golang语言中基本数据类型的默认值、类型转换的概述以及整型、浮点型、字符串之间的相互转换案例,包括如何将基本数据类型转换为字符串类型和字符串类型转换为基本数据类型,以及字符串与字节切片之间的转换。

                                              作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.基本数据类型默认值

package main

import "fmt"

func main() {

    // 在golang中,数据类型都有默认值,当程序员没有赋值时,会自动保留默认值(又称为"零值")
    var (
        a int     // 0
        b float32 // 0
        c float64 // 0
        d bool    // false
        e string  // ""
    )

    fmt.Printf("a ---> [%v]\n", a)
    fmt.Printf("b ---> [%v]\n", b)
    fmt.Printf("c ---> [%v]\n", c)
    fmt.Printf("d ---> [%v]\n", d)
    fmt.Printf("e ---> [%v]\n", e)

}

二.类型转换

1.类型转换概述

Go语言中只有强制类型转换,没有隐式类型转换。该语法只能在两个类型之间支持相互转换的时候使用。

强制类型转换的基本语法如下:
    T(v)

其中,T表示要转换的类型。v包括变量、复杂算子和函数返回值等.

在程序开发中,我们经常需要将基本数据类型转换成string类型:
    - 方式一(强烈推荐): fmt.Sprintf("%参数",表达式);
    - 方式二(不推荐): 使用strconv包的函数;

或者将string类型转换成基本数据类型:
    方式: 使用strconv包的函数。

2.整型和浮点类型转换案例

package main

import (
    "fmt"
)

func main() {

    var (
        a int = 100
        // 注意,此处是将a的值转换为float32类型,a的类型并没有发生变化哟~
        b float32 = float32(a)

        c int64 = 129

        // 将int64转换为int8的时候,编译不会报错,但是数据会溢出。
        d int8 = int8(c) + 127

        // 编译无法通过,因为128超出了int8的取值范围(-128~127)
        // e int8 = int8(c)+128
    )
    fmt.Printf("a = [%v], a = [%T]\n", a, a)
    fmt.Printf("b = [%v], b = [%T]\n", b, b)

    fmt.Printf("c = [%v], c = [%T]\n", c, c)
    fmt.Printf("d = [%v], d = [%T]\n", d, d)
    // fmt.Printf("e = [%v], e = [%T]\n", e, e)
}

3.基本数据类型转字符串类型

package main

import (
    "fmt"
    "strconv"
)

func main() {
    var (
        a int     = 20
        b float64 = 3.1415926
        c bool    = false
        d byte    = 'Y'

        // 方式一: 基于"fmt.Sprintf"进行转换(推荐)
        s1 string = fmt.Sprintf("%d", a)
        s2 string = fmt.Sprintf("%f", b)
        s3 string = fmt.Sprintf("%t", c)
        s4 string = fmt.Sprintf("%c", d)

        // 方式二: 使用"strconv"包进行转换
        // 第一个参数必须转为int64类型,第二个参数子面量的进制类型
        s5 string = strconv.FormatInt(int64(a), 10)

        // 定义个参数是float64,第二个参数: 'f'表示(-ddd.dddd)格式,第三个参数是保留的小数点后面9位,第四个参数这个小数是float64类型。
        s6 string = strconv.FormatFloat(b, 'f', 9, 64)

        // 根据c的值返回"true"或"false”。
        s7 string = strconv.FormatBool(c)

        // 是FormatInt的无符号整数版本,但是存储的数据是一个对应的unicode的码值哟~并不是对应的字符!
        s8 string = strconv.FormatUint(uint64(d), 10)

    )

    fmt.Printf("s1对应的类型是: %T,s1 = %q\n", s1, s1)
    fmt.Printf("s2对应的类型是: %T,s2 = %q\n", s2, s2)
    fmt.Printf("s3对应的类型是: %T,s3 = %q\n", s3, s3)
    fmt.Printf("s4对应的类型是: %T,s4 = %q\n", s4, s4)

    fmt.Printf("s5对应的类型是: %T,s5 = %q\n", s5, s5)
    fmt.Printf("s6对应的类型是: %T,s6 = %q\n", s6, s6)
    fmt.Printf("s7对应的类型是: %T,s7 = %q\n", s7, s7)
    fmt.Printf("s8对应的类型是: %T,s8 = %q\n", s8, s8)
}

4.字符串类型转换为基本数据类型

package main

import (
    "fmt"
    "strconv"
)

func main() {
    var (
        s1   string = "true"
        s2          = "89"
        s3          = "3.1415926"
        name        = "yinzhengjie"
        a    bool
        b    int64
        c    float64
    )

    // 将字符串类型转换为bool类型
    a, _ = strconv.ParseBool(s1)

    // 将字符串类型转换为int类型
    b, _ = strconv.ParseInt(s2, 10, 64)

    // 将字符串类型转换为float类型
    c, _ = strconv.ParseFloat(s3, 64)

    fmt.Printf("a对应的类型是: %T, a= [%t]\n", a, a)
    fmt.Printf("b对应的类型是: %T, b= [%d]\n", b, b)
    fmt.Printf("c对应的类型是: %T, c= [%f]\n", c, c)

    // 如何想要将unicode码值字符串转换成一个byte或者rune类型,先要将其转换为int64类型,然后使用string内置函数将其转换为字符串类型输出。
    fmt.Printf("s2对应的字符为: [%q]\n",string(b))

    /*
        温馨提示:
            string向基本数据类型转换的时候,一定要确保string类型能够转成有效的数据类型,否则最后得到的结果就是按照对应类型的默认值("零值")输出。
    */
    a, _ = strconv.ParseBool(name)
    b, _ = strconv.ParseInt(name, 10, 64)
    c, _ = strconv.ParseFloat(name, 64)
    fmt.Printf("a对应的类型是: %T, a= [%t]\n", a, a)
    fmt.Printf("b对应的类型是: %T, b= [%d]\n", b, b)
    fmt.Printf("c对应的类型是: %T, c= [%f]\n", c, c)

}

5.字符串强制转换字节切片型案例

package main

import (
    "fmt"
)

func main() {

    s1 := "Big"
    fmt.Println("s1 ---> ", s1)

    // 将字符串强制转换成字节切片类型
    byteArray := []byte(s1)
    fmt.Println("修改前: byteArray ---> ", byteArray)

    byteArray[0] = 'P'
    fmt.Println("修改后: byteArray ---> ", byteArray)

    s2 := string(byteArray)
    fmt.Println("s2 ---> ", s2)
}
目录
相关文章
|
13天前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
43 4
Golang语言之管道channel快速入门篇
|
13天前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
40 3
Golang语言之gRPC程序设计示例
|
13天前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
36 4
|
13天前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
20 3
Golang语言之Prometheus的日志模块使用案例
|
13天前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
36 4
Golang语言文件操作快速入门篇
|
13天前
|
Go
Golang语言错误处理机制
这篇文章是关于Golang语言错误处理机制的教程,介绍了使用defer结合recover捕获错误、基于errors.New自定义错误以及使用panic抛出自定义错误的方法。
35 3
|
13天前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
23 4
Golang语言goroutine协程篇
|
13天前
|
Go
Golang语言之函数(func)进阶篇
这篇文章是关于Golang语言中函数高级用法的教程,涵盖了初始化函数、匿名函数、闭包函数、高阶函数、defer关键字以及系统函数的使用和案例。
16 3
Golang语言之函数(func)进阶篇
|
13天前
|
Go
Golang语言之函数(func)基础篇
这篇文章深入讲解了Golang语言中函数的定义和使用,包括函数的引入原因、使用细节、定义语法,并通过多个案例展示了如何定义不返回任何参数、返回一个或多个参数、返回值命名、可变参数的函数,同时探讨了函数默认值传递、指针传递、函数作为变量和参数、自定义数据类型以及返回值为切片类型的函数。
17 2
Golang语言之函数(func)基础篇
|
13天前
|
Go
Golang语言之映射(map)快速入门篇
这篇文章是关于Go语言中映射(map)的快速入门教程,涵盖了map的定义、创建方式、基本操作如增删改查、遍历、嵌套map的使用以及相关练习题。
21 5