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)
}

posted @ 2024-07-05 00:52  尹正杰  阅读(70)  评论(0编辑  收藏  举报