当前位置: 首页 > news >正文

GO学习2:基本数据类型 与 转换

目录

前言

1. 基本数据类型

1.1 整型

1.1.1 分类

1.1.2 特殊整型

1.1.3 unsafe.Sizeof

1.1.4 int不同长度直接的转换

1.1.5 数字字面量语法(Number literals syntax)

1.2 浮点型

1.2.1 概述

1.2.2 golang中float精度丢失问题

1.2.3 golang科学计数法表示符点类型

1.3 布尔值

1.4 字符串

1.4.1 字符串转义符

1.4.2 多行字符串

1.4.3 字符串的常用操作

1.5 byte和rune类型

Go语言的字符有两种类型

1.6 修改字符串

2.基本数据类型之间的转换

2.1 数值类型之间的相互转换

2.2 其他类型转换成string类型

2.2.1 sprintf把其他类型转换成string类型

2.2.2 使用strconv包里面的几种转换方法进行转换

2.3 string类型转换成数值类型

2.3.1 string类型转换成int类型

2.3.2 string类型转换成float类型

2.3.3 string类型转换成bool类型(意义不大)

2.3.4 string转字符

2.4 数值类型没法和bool类型进行转换


前言

Go语言中数据类型分为两类:

        基本数据类型

        复合数据类型

基本数据类型有:

        整型、浮点型、布尔型、字符型

复合数据类型有:

        数组、切片、结构体、函数、map、通道(channel)、接口等。


1. 基本数据类型

1.1 整型

1.1.1 分类

整型分为以下两个大类:
        有符号整形        按长度分为:int8、int16、int32、int64
        对应的无符号整型uint8、uint16、uint32、uint64

关于字节
        字节也叫 Byte,是计算机数据的基本存储单位。8bit()=1Byte(字节) 1024Byte(字节)=1KB
1024KB=1MB 1024MB=1GB 1024GB=1TB
  根据编码格式的不同,一个中文字占用的字节数也不同。
        
编码格式一个中文字符占用字节核心特点与应用场景
GB2312 / GBK  国标2 字节- 中国国家标准编码,专门用于处理中文;
- GB2312 仅支持 6763 个常用汉字,GBK 扩展后支持 2 万 + 汉字(含生僻字);
主要场景:Windows 系统默认中文编码(如记事本保存为 “ANSI” 时,中文系统下实际是 GBK)、早期中文软件 / 文档。
UTF-83 字节(部分生僻字 4 字节)- 国际通用的 “万国码”,可兼容全球所有语言(中文、英文、日文等);
- 设计灵活:英文占 1 字节,中文占 3 字节,极少数生僻字(如 “𪚥”)占 4 字节;
主要场景:网页(HTML 默认编码)、数据库(如 MySQL 默认)、程序代码(如 Java/Python)、移动 APP,是当前互联网和软件开发的主流编码。
UTF-162 字节 或 4 字节- 另一种 Unicode 编码格式,分 “小端序(UTF-16LE)” 和 “大端序(UTF-16BE)”;
- 大部分常用汉字(如 “中”“国”)占 2 字节,超出基础字符集的生僻字占 4 字节;
主要场景:Windows 系统内部处理(如记事本 “Unicode” 选项)、.NET 程序、部分文档格式(如 Office 文件)。

测试:   

  • 新建记事本,输入 1 个中文字符(如 “我”),分别用不同编码保存:
    • 保存为 “ANSI”(中文系统 = GBK):文件大小 2 字节;
    • 保存为 “UTF-8”:文件大小 3 字节(若勾选 “带 BOM”,会多 3 字节标识,总 6 字节,实际字符仍占 3 字节);
    • 保存为 “Unicode”(UTF-16LE):文件大小 4 字节(含 2 字节字节序标识,实际字符占 2 字节)。

1.1.2 特殊整型

        注意在使用 int 和 uint 类型时,不能假定它是 32 位或 64 位的整型,而是考虑 int 和 uint
可能在不同平台上的差异。
        注意事项实际项目中整数类型、切片、 map 的元素数量等都可以用 int 来表示。在涉及
到二进制传输、为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使
用 int 和 uint。
package mainimport "fmt"func main() {var num int64num = 123fmt.Printf("值为:%v 类型:%T\n", num, num) //值为:123 类型:int64
}

1.1.3 unsafe.Sizeof

        unsafe.Sizeof(n1) 是 unsafe 包的一个函数,可以返回 n1 变量占用的字节数。
package mainimport ("fmt""unsafe"
)func main() {var a int8 = 120fmt.Printf("%T\n", a) //int8fmt.Println(unsafe.Sizeof(a)) //1
}

1.1.4 int不同长度直接的转换

package mainimport ("fmt"
)func main() {var num1 int8num1 = 127num2 := int32(num1)fmt.Printf("值为:%v 类型:%T", num2, num2)//值为:127 类型:int32
}

1.1.5 数字字面量语法(Number literals syntax)

        Go1.13 版本之后引入了数字字面量语法,这样便于开发者以二进制、八进制或十六进制浮点数的格式定义数字。
例如:v := 0b00101101, 代表二进制的 101101,相当于十进制的 45。
           v := 0o377,代表八进制的377,相当于十进制的 255.
           v := 0x1p-2,代表十六进制的1除以2^2,也就是0.25。
还允许我们用 _ 来分隔数字。
          v := 123_456 就等于123456
##1. 十进制
import "fmt"func main() {var a inta = 10fmt.Printf("%d\n", a) //10fmt.Printf("%b\n", a) //1010
}

##2. 八进制   以 0 开头

package main
import "fmt"func main() {var a inta = 077fmt.Printf("%o\n", a)  //77
}

##3. 十六进制   以0x开头

package mainimport "fmt"func main() {var a inta = 0xfffmt.Printf("%x\n", a) //fffmt.Printf("%X\n", a)  //FFfmt.Printf("%d\n", a)  //255
}

1.2 浮点型

1.2.1 概述

        Go 语言支持两种浮点型数:float32 和 float64。
这两种浮点型数据格式遵循 IEEE 754 标准:
        float32 的浮点数的最大范围约为 3.4e38,可以使用常量定义:math.MaxFloat32。
        float64 的 浮点数的最大范围约为 1.8e308,可以使用一个常量定义:math.MaxFloat64。
package mainimport ("fmt""math"
)func main() {fmt.Printf("%f\n", math.Pi) //3.141593 默认保留 6 位小数fmt.Printf("%.2f\n", math.Pi) //3.14
}

Go语言中浮点数默认是float64

	num := 1.1fmt.Printf("值: %v --类型:%T", num, num) //值: 1.1 --类型:float64

1.2.2 golang中float精度丢失问题

        几乎所有的编程语言都有精度丢失这个问题,这是典型的二进制浮点数精度损失问题,在定 长条件下,二进制小数和十进制小数互转可能有精度丢失。
d := 1129.6
fmt.Println((d * 100)) //112959.99999999999
var d float64 = 1129.6
fmt.Println((d * 100)) //112959.99999999999
m1 := 8.2
m2 := 3.8
fmt.Println(m1 - m2) //期望是 4.4,但是打印出了4.3999999999999995

可以使用第三方包来解决精度损失问题:

https://github.com/shopspring/decimal

1.2.3 golang科学计数法表示符点类型

	num1 := 5.1234e2 //5.1234 * 10 的 2 次方num2 := 5.1234e2 //5.1234 * 10 的 2 次方 shift+alt+向下的箭头num3 := 5.1234e-2 //5.1234 / 10 的 2 次方 0.051234fmt.Println("num1=", num1, "num2=", num2, "num3=", num3) //num1= 512.34 num2= 512.34 num3= 0.051234

1.3 布尔值

        Go 语言中以 bool 类型进行声明布尔型数据,布尔型数据只有 true(真)和 false(假)两个值。
注意:
        1. 布尔类型变量的默认值为 false。
        2. Go 语言中不允许将整型强制转换为布尔型.
        3. 布尔型无法参与数值运算,也无法与其他类型进行转换。 
package mainimport ("fmt""unsafe"
)func main() {var a = truefmt.Println(a, "占用字节:", unsafe.Sizeof(a)) //true 占用字节: 1
}

1.4 字符串

        Go 语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64 等)一样。 Go 语言里的字符串的内部实现使用 UTF-8 编码。 字符串的值
为双引号(")中的内容,可以在 Go 语言的源码中直接添加非 ASCII 码字符,例如:

s1 := "hello"
s2 := "你好"

1.4.1 字符串转义符

        Go 语言的字符串常见转义符包含回车、换行、单双引号、制表符等,如下表所示。

举个例子,我们要打印一个 Windows 平台下的一个文件路径:

//str := "D:\godemo\demo01\main.go"
fmt.Println("str := \"D:\\godemo\\demo01\\main.go\"")

1.4.2 多行字符串

        Go 语言中要定义一个多行字符串时,就必须使用反引号字符:
s1 := `第一行
第二行

第三行
`
fmt.Println(s1)
        反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。
	s1 := `"hello"
"hi"
"你好"
`fmt.Println(s1)//"hello"//"hi"//"你好"

1.4.3 字符串的常用操作

$$1. len(str)求字符串的长度

var str = "this is str"fmt.Println(len(str))//11

$$2. 拼接字符串

var str1 = "您好"var str2 = "golang"fmt.Println(str1 + str2) // 您好golangvar str3 = fmt.Sprintf("%v %v", str1, str2)fmt.Println(str3)   //您好 golang

$$3. strings.Split 分割字符串

var str = "123-456-789"var arr = strings.Split(str, "-")fmt.Println(arr)            //[123 456 789]fmt.Printf("%T \n", arr)    //[]stringfmt.Printf("%T \n", arr[0]) //string

$$4. 判断包含字符串

var str = "this is golang"var flag = strings.Contains(str, "golang")fmt.Println(flag) //true

$$5. 判断首字符尾字母是否包含指定字符

var str = "this is golang"var flag = strings.HasPrefix(str, "this")fmt.Println(flag) //trueflag = strings.HasSuffix(str, "go")fmt.Println(flag) //false

$$6. 判断字符串出现的位置

	var str = "this is golang"var index = strings.Index(str, "is") //从前往后fmt.Println(index)                   //2index = strings.LastIndex(str, "is") //从后往前fmt.Println(index)      //5

$$7. Join拼接字符串

var str = "123-456-789"
var arr = strings.Split(str, "-")var str2 = strings.Join(arr, "*")fmt.Println(str2) //123*456*789

1.5 byte和rune类型

        组成每个字符串的元素叫做“字符”,可以通过遍历字符串元素获得字符。 字符用单引号(’)包裹起来,如:
a := 'a'b := 'b'//当我们直接输出 byte(字符)的时候输出的是这个字符对应的码值fmt.Println(a) //97fmt.Println(b) //98//%c 相应 Unicode 码点所表示的字符fmt.Printf("%c--%c\n", a, b) //a--b
        字节(byte:是计算机中 数据处理 的基本单位,习惯上用大写 B 来表示,1Bbyte,字节)
= 8bit(位)
        字符:是指计算机中使用的字母、数字、字和符号

一个汉字占用 3 个字节    一个字母占用一个字节

a := "m"fmt.Println(len(a)) //1b := "张"fmt.Println(len(b)) //3

Go语言的字符有两种类型

1. uint8 类型,或者叫 byte 型,代表了 ASCII 码的一个字符。
2. rune 类型,代表一个 UTF-8 字符。
        当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型实际是一个 int32。
        Go 使用了特殊的 rune 类型来处理 Unicode,让基于 Unicode 的文本处理更为方便,也可以使用 byte 型进行默认字符串处理,性能和扩展性都有照顾。
s := "hello 张三"for i := 0; i < len(s); i++ { //bytefmt.Printf("%v(%c) ", s[i], s[i])}//104(h) 101(e) 108(l) 108(l) 111(o) 32( ) 229(å) 188(¼) 160( ) 228(ä) 184(¸) 137(‰) fmt.Println()for _, r := range s { //runefmt.Printf("%v(%c) ", r, r)}//104(h) 101(e) 108(l) 108(l) 111(o) 32( ) 24352(张) 19977(三) fmt.Println()
        因为 UTF8 编码下一个中文汉字由 3 个字节组成,所以我们不能简单的按照字节去遍历一个
包含中文的字符串,否则就会出现上面输出中第一行的结果。
        字符串底层是一个 byte 数组,所以可以和[]byte 类型相互转换。字符串是不能修改的 字符
串是由 byte 字节组成,所以字符串的长度是 byte 字节的长度。 rune 类型用来表示 utf8 字符,一个 rune 字符由一个或多个 byte 组成。
rune 类型实际是一个 int32

	c3 := "营"c4 := '营'fmt.Printf("C3 的类型%T--C4 的类型%T", c3, c4) //C3 的类型 string--C4 的类型 int32

1.6 修改字符串

        要修改字符串,需要先将其转换成[]rune 或[]byte,完成后再转换为 string。无论哪种转换, 都会重新分配内存,并复制字节数组。
func changeString() {s1 := "big"//强制类型转换byteS1 := []byte(s1)byteS1[0] = 'p'fmt.Println(string(byteS1))s2 := "白萝卜"runeS2 := []rune(s2)runeS2[0] = '红'fmt.Println(string(runeS2))
}

2.基本数据类型之间的转换

Go 语言中只有强制类型转换,没有隐式类型转换。

2.1 数值类型之间的相互转换

数值类型:

        整型浮点型

package main
import "fmt"
func main() {
var a int8 = 20
var b int16 = 40
var c = int16(a) + b //要转换成相同类型才能运行
fmt.Printf("值:%v--类型%T", c, c) //值:60--类型 int16
}
package main
import "fmt"
func main() {var a float32 = 3.2var b int16 = 6var c = a + float32(b)fmt.Printf("值:%v--类型%T", c, c) //值:9.2--类型 float32
}
        转换的时候建议从低位转换成高位,高位转换成低位的时候如果转换不成功就会溢出,和我
们想的结果不一样。
例如:
package main
func main() {var a int16 = 129var b = int8(a) // 范围 -128 到 127println("b=", b) //b= -127 //错误
}
        比如计算直角三角形的斜边长时使用 math 包的 Sqrt()函数,该函数接收的是 float64 类型的
参数,而变量 a 和 b 都是 int 类型的,这个时候就需要将 a 和 b 强制类型转换为 float64 类型。
var a, b = 3, 4
var c int
// math.Sqrt()接收的参数是 float64 类型,需要强制转换
c = int(math.Sqrt(float64(a*a + b*b)))
fmt.Println(c)

2.2 其他类型转换成string类型

2.2.1 sprintf把其他类型转换成string类型

        注意sprintf 使用中需要注意转换的格式
                 int 为%d
                 float 为%f
                 bool 为%t
                 byte 为%c
package main
import "fmt"
func main() {var i int = 20var f float64 = 12.456var t bool = truevar b byte = 'a' var strs stringstrs = fmt.Sprintf("%d", i)fmt.Printf("str type %T ,strs=%v \n", strs, strs)//str type string ,strs=20strs = fmt.Sprintf("%f", f)fmt.Printf("str type %T ,strs=%v \n", strs, strs)//str type string ,strs=12.456000strs = fmt.Sprintf("%t", t)fmt.Printf("str type %T ,strs=%v \n", strs, strs)//str type string ,strs=truestrs = fmt.Sprintf("%c", b)fmt.Printf("str type %T ,strs=%v \n", strs, strs)//str type string ,strs=a
}

2.2.2 使用strconv包里面的几种转换方法进行转换

package main
import ( "fmt""strconv"
)
func main() {//1、int 转换成 stringvar num1 int = 20s1 := strconv.Itoa(num1)fmt.Printf("str type %T ,strs=%v \n", s1, s1)// 2、float 转 stringvar num2 float64 = 20.113123/* 参数 1:要转换的值参数 2:格式化类型'f'(-ddd.dddd)、'b'(-ddddp±ddd,指数为二进制)、'e'(-d.dddde±dd,十进制指数)、'E'(-d.ddddE±dd,十进制指数)、'g'(指数很大时用'e'格式,否则'f'格式)、'G'(指数很大时用'E'格式,否则'f'格式)。参数 3: 保留的小数点 -1(不对小数点格式化)参数 4:格式化的类型
*/s2 := strconv.FormatFloat(num2, 'f', 2, 64)fmt.Printf("str type %T ,strs=%v \n", s2, s2)// 3、bool 转 strings3 := strconv.FormatBool(true)fmt.Printf("str type %T ,strs=%v \n", s3, s3)//4、int64 转 stringvar num3 int64 = 20/*第二个参数为 进制*/s4 := strconv.FormatInt(num3, 10)fmt.Printf("类型 %T ,strs=%v \n", s4, s4)
}

2.3 string类型转换成数值类型

2.3.1 string类型转换成int类型

var s = "1234"
i64, _ := strconv.ParseInt(s, 10, 64)
fmt.Printf("值:%v 类型:%T", i64, i64)

2.3.2 string类型转换成float类型

str := "3.1415926535" 
v1, _ := strconv.ParseFloat(str, 32)
v2, _ := strconv.ParseFloat(str, 64)fmt.Printf("值:%v 类型:%T\n", v1, v1)
fmt.Printf("值:%v 类型:%T", v2, v2)

2.3.3 string类型转换成bool类型(意义不大)

b, _ := strconv.ParseBool("true") // string 转 bool
fmt.Printf("值:%v 类型:%T", b, b)

2.3.4 string转字符

s := "hello 张三"
for _, r := range s { //runefmt.Printf("%v(%c) ", r, r)
}
fmt.Println()

2.4 数值类型没法和bool类型进行转换

        注意:在 go 语言中数值类型没法直接转换成 bool 类型 bool 类型也没法直接转换成数值类
型。
http://www.dtcms.com/a/426811.html

相关文章:

  • 南京网站开发联系南京乐识昆明餐饮网站建设
  • 3D打印技术如何重塑PEM双极板的制造范式?
  • Excel工作表自动追加工具项目总结报告
  • AR技术赋能航空制造:开启智能装配新时代
  • 盟接之桥说制造:源头制胜,降本增效:从“盟接之桥”看供应链成本控制的底层逻辑
  • 网站名称推荐高端网站设计v芯hyhyk1推好
  • 基于skynet框架业务中的gateway实现分析
  • OpenCV基础操作与图像处理
  • 北京高端网站建设图片大全dede做手机网站
  • 关于Pycharm的conda虚拟环境包更改路径问题的配置问题
  • 从Docker到K8s:MySQL容器化部署的终极进化论
  • Windows Server 2022离线搭建Gitlab
  • iPhone 用户如何通过鼠标提升操作体验?
  • 传统小型企业做网站的好处wordpress的主题切换不成功
  • 开个小网站要怎么做网络培训中心
  • 【Linux】库的制作与原理(2)
  • 制作英文网站费用wordpress添加网站
  • synchronized底层原理+锁升级
  • VGG改进(12):PositionAttentionModule 源码解析与设计思想
  • OpenCV项目实战——数字识别代码及食用指南
  • Promise详细解析
  • 【从Vue3到React】Day 1: React基础概念
  • Hotfixes数据库工作原理、机制和应用流程
  • 网站建设面试表wordpress建m域名网站
  • Node.js面试题及详细答案120题(93-100) -- 错误处理与调试篇
  • pc端js动态调用提示音音频报错的问题解决
  • 网站的建设特色网站开发培训哪家好
  • C# 中的 简单工厂模式 (Simple Factory)
  • Docker linux 离线部署springcloud
  • 第 2 天:搭建 C 语言开发环境 ——VS Code/Dev-C++/Code::Blocks 安装与配置全指南