【30天熟悉Go语言】5 Go 基本数据类型

news2024/11/16 9:23:10

文章目录

  • 一、前言
  • 二、数据类型总览
    • 1、基本数据类型
      • 1)数值型-整数类型
        • 1> 有符号整数类型:
        • 2> 无符号整数类型:
        • 3> 其他整数类型:
        • 4> PS:Go的整数类型,默认声明为int类型:
        • 5> 变量占用的字节数
      • 2、数值型-浮点类型
        • 1> 浮点类型种类
        • 2> PS:Go的浮点类型,默认声明为float64类型:
      • 3、字符类型
      • 4、布尔类型
      • 5、字符串类型
    • 2、复杂数据类型
  • 三、类型转换
    • 1、基本数据类型之间的转换
      • 1)强制转换
        • 1> 强转报错:数据溢出
        • 2> 数据溢出自动判断
      • 2)其他基本类型转string
        • 1> fmt.Sprintf
        • 2> strconv
      • 3)string转其他基本类型
  • 四、总结
    • 对比着看Java的基本数据类型

一、前言

在这里插入图片描述

Go系列文章:

  1. GO开篇:手握Java走进Golang的世界
  2. 2 Go开发环境搭建、Hello World程序运行
  3. 3 Go编程规约和API包
  4. 4 Go的变量、常量、运算符

Go专栏传送链接:https://blog.csdn.net/saintmm/category_12326997.html

二、数据类型总览

在这里插入图片描述

1、基本数据类型

基本数据类型大体来看有四种:数值型、字符型、布尔型、字符串。数值型又分为整数类型和浮点类型。

1)数值型-整数类型

用于存放整数值的,比如10,1002,-6712等等。

按数据范围进一步细分,整数类型又分:int8、int16、int32、int64。所谓的8/16/32/64只是用于表示数据临界范围

1> 有符号整数类型:

在这里插入图片描述

2> 无符号整数类型:

在这里插入图片描述

3> 其他整数类型:

在这里插入图片描述

4> PS:Go的整数类型,默认声明为int类型:

在这里插入图片描述

  • Printf函数的作用是格式化,把age的类型填充到%T位置上。

5> 变量占用的字节数

使用unsafe包下的Sizeof()方法;

package main

import "fmt"
import "unsafe"
// 基础数据类型
func main() {

	age := 18
	fmt.Printf("age的类型是: %T", age)
	fmt.Println();
	fmt.Println("------------------")
	fmt.Println(unsafe.Sizeof(age))
}

在这里插入图片描述

2、数值型-浮点类型

浮点类型用于存放小数,比如:3.14、0.33、-1.19等等。

1> 浮点类型种类

浮点类型有两种:32位float 和 64位float。
在这里插入图片描述

其底层存储空间和操作系统无关。

由于浮点类型底层存储:符号位+指数位+尾数位,所以尾数位只是存了 一个大概,很可能会出现精度的损失

package main

import (
	"fmt"
	"unsafe"
)

// 基础数据类型
func main() {
	float()
}

func float() {
	// 定义浮点类型数据
	var num1 float32 = 3.14
	fmt.Println(num1)

	//浮点数可以用十进制表示形式,也可以用科学计数法表示形式  E 大写小写都可以的
	var num2 float32 = 314E-2
	fmt.Println(num2)

	//浮点数可能会有精度的损失,所以通常情况下,建议使用:float64
	var num3 float32 = 234.000000916
	fmt.Println(num3)
	var num4 float64 = 234.000000916
	fmt.Println(num4)
}

控制台输出如下:
在这里插入图片描述

2> PS:Go的浮点类型,默认声明为float64类型:

// golang中默认的浮点类型为:float64
num5 := 3.17
fmt.Printf("num5对应的默认的类型为:%T",num5)

在这里插入图片描述

当我们在IDEA声明一个float64数据类型的变量时,IDEA编译器会提示:

在这里插入图片描述

3、字符类型

Go中没有专门的字符类型;

如果要存储单个字符(字母、数字、标点等符号),底层对应的是ASCII码值,一般使用byte来保存;
Go中字符使用UTF-8编码,底层对应的是Unicode码值(Unicode是对应的字符集,UTF-8是Unicode的其中的一种编码方案),中文的码值可能会导致byte类型溢出,建议使用int 或 rune存在中文字符。

因此在 Go 语言中,字符可以被分成两种类型处理:

  • 对占 1 个字节的英文类字符,可以使用byte(或者unit8);
  • 对占 1 ~ 4 个字节的其他字符,可以使用rune(或者int32),如中文、特殊符号等。

ASCII码表:

在这里插入图片描述

字符类型,本质上就是一个整数,也可以直接参与运算,输出字符的时候,会将对应的码值做一个输出:

在这里插入图片描述

想显示对应的字符,必须采用格式化输出:

var c4 byte = 'A'
fmt.Printf("c4对应的具体的字符为:%c",c4)

测试代码:

func char() {
	// 定义字符类型的数据
	var c1 byte = 'a'
	// 字符类型,本质上就是一个整数,也可以直接参与运算,输出字符的时候,会将对应的码值做一个输出
	// 输出97
	fmt.Println(c1)

	var c2 byte = '('
	// 字母,数字,标点等字符,底层是按照ASCII进行存储。
	// 输出 40
	fmt.Println(c2 + 20)

	var c3 int = '中'
	// 汉字字符,底层对应的是Unicode码值,中字对应的码值为20013,byte类型溢出,可以用int存储
	fmt.Println(c3)

	var c4 byte = 'A'
	// 想显示对应的字符,必须采用格式化输出
	fmt.Printf("c4对应的具体的字符为:%c",c4)

}

4、布尔类型

布尔类型也叫bool类型,bool类型数据只允许取值true和false;

  • 占1个字节
  • 用于逻辑运算,大量使用于程序流程控制。
package main

import (
	"fmt"
)

// 基础数据类型
func main() {
	boolean()
}
func boolean() {
	var b1 bool = true
	fmt.Println(b1)
	b2 := false
	fmt.Println(b2)
	b3 := 5 < 9
	fmt.Println(b3)
}

控制台输出:
在这里插入图片描述

5、字符串类型

字符串是一串固定长度的字符连接起来的字符序列;

  • 字符串是不可变的,指字符串一旦定义好,其中字符的值不能改变,但是字符串的引用可以改变。
  • 如果字符串中没有特殊字符,字符串的表示形式用双引号“”
  • 如果字符串中有特殊字符,字符串的表示形式用反引号 ``
  • 字符串拼接可以直接使用加号+

测试代码:

package main

import (
	"fmt"
	"unsafe"
)

// 基础数据类型
func main() {
	typeString()
}

func typeString() {
	// 1.定义一个字符串
	var s1 string = "Hello world!"
	fmt.Println(s1)
	// 2. 字符串是不可变的, 指字符串一旦定义好,其中字符的值不能改变,但是字符串的引用可以改变。
	s2 := "abc"
	//s2[0] = 'q']
	// 这里会改变字符串s2的引用
	//s2 = "def"
	fmt.Println(s2)

	// 3.字符串的表示形式:
	//(1)如果字符串中没有特殊字符,字符串的表示形式用双引号
	s3 := "123ads"
	fmt.Println(s3)
	//(2)如果字符串中有特殊字符,字符串的表示形式用反引号 ``
	s4 := `
					package main
					import "fmt"
					func main() {
						//
					}`
	fmt.Println(s4)

	// 4.字符串拼接
	s5 := "123" + "321asd"
	fmt.Println(s5)

}

控制台输出:
在这里插入图片描述

2、复杂数据类型

复杂数据类型见后面的文章

三、类型转换

1、基本数据类型之间的转换

1)强制转换

Go在不同类型的变量之间赋值时需要显式转换,并且只有显式转换(强制转换)。

语法:表达式 T(v)值 v 转换为类型 T

  • T : 是数据类型
  • v : 是需要转换的变量
  • 强转后,变量v的类型不会发生改变

例如:将int转为float32

// 1. 进行类型转换:
var n1 int = 100
fmt.Println(n1)
var n2 float32 = float32(n1)
fmt.Println(n2)

// n1的类型还是int,只是将n1的值100转为了float32赋值给n2而已。
fmt.Printf("%T",n1)

1> 强转报错:数据溢出

<1> 编译通过,执行时会数据溢出

// 2. 强转报错:超过数据范围
var n3 int64 = 888888
var n4 int8 = int8(n3)
// 将int64转为int8,编译不会出错,但是会数据溢出
fmt.Println(n4)

2> 数据溢出自动判断

常量 + 一个变量,如果常量不超过相应类型的数据边界,可以编译通过;超过则编译不通过;

// 3. 数据溢出判断
var n5 int64 = 12
// 编译通过,但是结果可能会溢出
var n6 int8 = int8(n5) + 127
// 编译不会通过
var n7 int8 = int8(n5) + 128
fmt.Println(n7)
fmt.Println(n6)

在这里插入图片描述

即使 n5 变量你声明为负数,依旧编译不通过;

在这里插入图片描述

2)其他基本类型转string

其他基本类型转string有两种方式:

  1. fmt.Sprintf("%参数", 表达式) ,推荐使用;
  2. 使用strconv包的函数;

1> fmt.Sprintf

在这里插入图片描述

从https://pkg.go.dev/fmt@go1.20.5#Sprintf文档中可以看到各种参数占位符;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(1)int 转 string:

var n1 int = 6
var s1 string = fmt.Sprintf("%d",n1)
fmt.Printf("s1对应的类型是:%T ,s1 = %q \n",s1, s1)

(2)float32转 string:

var n2 float32 = 6.78
var s2 string = fmt.Sprintf("%f",n2)
fmt.Printf("s2对应的类型是:%T ,s2 = %q \n",s2, s2)

(3)bool 转 string:

var n3 bool = false
var s3 string = fmt.Sprintf("%t",n3)
fmt.Printf("s3对应的类型是:%T ,s3 = %q \n",s3, s3)

(4)byte 转 string:

var n4 byte = 'd'
var s4 string = fmt.Sprintf("%c",n4)
fmt.Printf("s4对应的类型是:%T ,s4 = %q \n",s4, s4)

控制台输出:
在这里插入图片描述

2> strconv

API文档:https://pkg.go.dev/strconv@go1.20.5#FormatBool

在这里插入图片描述

var n1 int = 6
// 参数:第一个参数必须转为int64类型 ,第二个参数指定字面值的进制形式为十进制
var s1 string = strconv.FormatInt(int64(n1),10)
fmt.Printf("s1对应的类型是:%T ,s1 = %q \n",s1, s1)
var n2 float64 = 6.78

// 第二个参数:'f'表示格式化为(-ddd.dddd,不带指数形式)  第三个参数:9 保留小数点后面9位  第四个参数:表示这个小数是float64类型
var s2 string = strconv.FormatFloat(n2,'f',9,64)
fmt.Printf("s2对应的类型是:%T ,s2 = %q \n",s2, s2)

var n3 bool = true
var s3 string = strconv.FormatBool(n3)
fmt.Printf("s3对应的类型是:%T ,s3 = %q \n",s3, s3)

控制台输出:
在这里插入图片描述

3)string转其他基本类型

string转其他基本类型的方式为使用strconv包的函数,比如:strconv.ParseInt,strconv.ParseFloat

API文档:https://pkg.go.dev/strconv@go1.20.5#ParseBool

在这里插入图片描述

// string --> bool
var s1 string = "true"
var b bool
// ParseBool函数的返回值有两个:(value bool, err error) ,value是我们得到的布尔类型的数据,err表示出现的错误
// 如果只关注布尔类型的数据,err可以用_标识符接收、直接忽略掉。
b , _ = strconv.ParseBool(s1)
fmt.Printf("b的类型是:%T,b=%v \n",b,b)

// string --> int64
var s2 string = "19"
var num1 int64
num1,_ = strconv.ParseInt(s2,10,64)
fmt.Printf("num1的类型是:%T,num1=%v \n",num1,num1)

// string --> float32/float64
var s3 string = "3.14"
var f1 float64
f1,_ = strconv.ParseFloat(s3,64)
fmt.Printf("f1的类型是:%T,f1=%v \n",f1,f1)

控制台输出:
在这里插入图片描述

PS:string向基本数据类型转换的时候,一定要确保string类型能够转成有效的数据类型,否则最后得到的结果为:对应类型的默认值

var s4 string = "golang"
var b1 bool
b1 , _ = strconv.ParseBool(s4)
fmt.Printf("b1的类型是:%T,b1=%v \n",b1,b1)

var s5 string = "golang"
var num2 int64
num2,_ = strconv.ParseInt(s5,10,64)
fmt.Printf("num2的类型是:%T,num2=%v \n",num2,num2)

控制台输出:
在这里插入图片描述

四、总结

基本数据类型的默认值(在Go中数据类型都有一个默认值,当程序员没有赋值时,就会保留默认值(默认值又叫零值))为:
在这里插入图片描述

对比着看Java的基本数据类型

java的基本数据类型有8种:byte、short、int、long、float、double、boolean、char;

Go的基本类型有五种:

  • 布尔型:关键字【bool】: true false
  • 整数类型:又细分为有符号整数类型和无符号整数类型;
    • 有符号整数类型(第一位代表正负):int、int8、int16、int32、int64
    • 无符号整数类型:uint、uint8、uint16、uint32、uint64
  • 浮点类型:float32、float64
  • 字符串:string
  • 字符类型:byte(等同uint8,类似于一个别名),用于存放占 1 字节的 ASCII 字符,如英文字符,返回字符原始字节。
    • rune(等同int32,只是一个别名),用于存放多字节字符,如占 3 字节的中文字符,返回字符 Unicode 码点值

Java和Go基本数据类型的映射为:

JavaGo
byte(有符号型,字节数据类型)byte(无符号型,等同uint8,类似一个别名)
shortint16
intint32
longint64
floatfloat32
doublefloat64
booleanbool
char(无符号型,字符数据类型)uint16

PS:

  • Go中整型的默认类型为int,int是32还是64位取决于操作系统的位数;
  • Go没有float类型,只有float32和float64
  • Go中string也是基本数据类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/637359.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PowerShell系列(六):PowerShell脚本执行策略梳理

目录 1、执行策略等级 2、执行策略范围 3、执行策略命令语法格式 4、执行策略常用命令 PowerShell 是一种用于操作 系统的命令行界面&#xff0c;支持跨平台&#xff0c;它提供了许多功能来自动化和优化各种任务。PowerShell 是由微软官方开发的&#xff0c;并作为 Windows Ser…

教培行业的“智能GPT私教”?WorkPlusAI助理帮助教培机构实现十倍人效!

从横空出世到掀起高潮&#xff0c;当下&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;模式下的ChatGPT它正以惊人的速度席卷各个领域&#xff0c;在线教培行业也不例外。那么&#xff0c;正式进入落地期的ChatGPT&#xff0c;在在线教培行业有那些应用前景呢&#…

QT中信号和槽的概念

信号就是发生什么事件&#xff0c;槽就是触发什么函数&#xff0c;所以信号与槽就是发生什么事件(比如点击某个按钮)然后就会触发某个函数 connect(信号的发送者&#xff0c;发送的具体信号&#xff0c;信号的接受者&#xff0c;信号的处理&#xff09; connect(myButton , &a…

Android 内存泄漏

名词解释 内存泄漏:即memory leak。是指内存空间使用完毕后无法被释放的现象&#xff0c;虽然Java有垃圾回收机制&#xff08;GC&#xff09;&#xff0c;但是对于还保持着引用&#xff0c; 该内存不能再被分配使用&#xff0c;逻辑上却已经不会再用到的对象&#xff0c;垃圾回…

阿里P8整理的《亿级并发系统设计》实战教程,面面俱到,实在太全了

候&#xff0c;那系统架构一定不是那么简单的&#xff0c;用个 redis&#xff0c;用 mq 就能搞定&#xff1f;当然不是&#xff0c;真实的系统架构搭配上业务之后&#xff0c;会比这种简单的所谓“高并发架构”要复杂很多倍。 如果有面试官问你个问题说&#xff0c;如何设计一…

亚马逊、eBay新品期没有出单怎么办?自养买家号的重要性和技巧

一&#xff1a;新品期没有出单怎么办&#xff1f; 1.刚开始,低bid 调整&#xff0c;20元预算&#xff0c;让位置可以靠后点&#xff0c;因为前期跟前面比&#xff0c;比不赢&#xff0c;不如去后面比。 2.价格不是由卖家单一决定&#xff0c;而是由市场决定的。 3.切记自嗨型…

Kotlin Lambda表达式和匿名函数的组合简直太强了

Kotlin Lambda表达式和匿名函数的组合简直太强了 简介 首先&#xff0c;在 Kotlin 中&#xff0c;函数是“第一公民”&#xff08;First Class Citizen&#xff09;。因此&#xff0c;它们可以被分配为变量的值&#xff0c;作为其他函数的参数传递或者函数的返回值。同样&…

去中心化公链生态是否还有未来

2020年流动性挖矿带来的高收益让 DeFi Summer 点燃了2021年的大牛市。质押借贷、AMM作市、DEX、GameFi以及元宇宙等赛道的相继爆火&#xff0c;让整个行业看到了区块链的未来潜力&#xff0c;公链生态的繁荣也给项目带来了更多的可能性。而当市场进入熊市时&#xff0c;不少公链…

【netty基础】Java NIO三件套

文章目录 一. 缓冲区1&#xff0e;Buffer操作基本API2&#xff0e;Buffer的基本原理2.1. put操作2.2. get操作2.3. clear()回到初始化buffer的值 3&#xff0e;缓冲区的分配4&#xff0e;缓冲区分片5&#xff0e;只读缓冲区6. 直接(direct)缓冲区7. 内存映射 二. 选择器三. 通道…

直接插入排序--C语言(附详细代码)(附图详解)

目录 插入排序法的介绍 什么是插入排序法&#xff1f; 稳定性分析 插入排序基本思想 例子分析 实现代码 运行结果 插入排序法的介绍 什么是插入排序法&#xff1f; 插入排序&#xff0c;一般也被称为直接插入排序。对于少量元素的排序&#xff0c;它是一个有效的算法 。…

Django-3.2-LTS兼容哪些Python版本?支不支持Python3.9.10?

问&#xff1a;请问Python的3.9.10版本兼不兼容Django的3.2版&#xff1f; 答&#xff1a;Python 3.9.10 和 Django 3.2 之间是兼容的。Django 3.2 是一个长期支持&#xff08;LTS&#xff09;版本&#xff0c;它支持 Python 3.6、3.7、3.8 和 3.9。因此&#xff0c;Python 3.9…

母线差动保护(二)

3、大差和小差 接入大差元件的电流为I母、II母所有支路&#xff08;母联除外&#xff09;的电流&#xff0c;目的是为了判断故障是否为母线区内故障&#xff1b;接入小差元件的电流为接入该段母线的所有支路的电流&#xff0c;目的是为了判断故障具体发生在哪一条母线上。 以双…

ifconfig: RX packets 一直为 0

本博客的很多内容都是经验之谈&#xff0c;目的是给遇到类似问题的小伙伴提供一个解决问题的思路&#xff0c;如果试了不行&#xff0c;可以快速跳过&#xff0c;再寻找其他的解决方案。 如题目所言&#xff0c;今天遇到的问题是和网络连通性相关的&#xff0c;就是网络不通&a…

为什么企业推行OEE总是坚持不下去?

OEE很难推行吗&#xff1f; 企业追求高效率和减少浪费变得尤为重要&#xff0c;而在这个过程中&#xff0c;OEE&#xff08;Overall Equipment Efficiency&#xff09;成为了一个非常有用的工具&#xff0c;它可以为企业提供准确的数据&#xff0c;了解生产过程中存在的浪费程…

AttributeError: module ‘numpy‘ has no attribute ‘typeDict‘

问题描述&#xff1a;运行一个网上下载的PyQt5代码&#xff0c;出现了AttributeError: module numpy has no attribute typeDict的错误。具体如下&#xff1a; Traceback (most recent call last):File "F:/PyQt5/Javacr/main.py", line 16, in <module>from …

面向对象的介绍和内存

学习面向对象内容的三条主线 • Java 类及类的成员&#xff1a;&#xff08;重点&#xff09;属性、方法、构造器&#xff1b;&#xff08;熟悉&#xff09;代码块、内部类 • 面向对象的特征&#xff1a;封装、继承、多态、&#xff08;抽象&#xff09; • 其他关键字的使用…

3 个技巧,让你像技术专家一样解决编码问题

「我应该如何提高解决问题的能力&#xff1f;尽管我掌握了 JavaScript&#xff0c;却无法解决实际问题或理解复杂的 JavaScript 代码。」 经常有年轻的开发者朋友问我类似的问题。对开发者来说&#xff0c;解决问题非常重要。编写优秀的代码是一门创造性的艺术&#xff0c;而要…

Linux第二章之基本指令

目录 第一章、基本指令 01. ls 指令 02. pwd命令 03. cd 指令 04. touch指令 05.mkdir指令&#xff08;重要&#xff09; 06.rmdir指令 && rm 指令&#xff08;重要&#xff09; 07.man指令&#xff08;重要&#xff09; 08.cp指令&#xff08;重要&#xff0…

【性能测试系列】JMeter核心技术:分布式压测和参数化

JMeter分布式压测 为什么要做分布式部署? 在上一篇文章中&#xff0c;我们提到了JMeter的线程启动和运行&#xff0c;是会占用系统资源的&#xff0c;一旦需要大并发&#xff0c;而JMeter单机部署配置不够&#xff0c;将会导致JMeter无法在规定时间内启动对应的线程数&#x…

OpenCV项目开发实战--对图像进行非真实感渲染-附Python、C++的代码实现

编写一个过滤器来创建如上所示的风格化/卡通化图像,OpenCV 3 中边缘保留过滤的非常快速的实现。结果与双边过滤非常相似,但速度更快。 用于边缘感知过滤的域变换 它是Eduardo Gastal 和 Manuel Oliveira 在SIGGRAPH 2011 上题为“边缘感知图像和视频处理的域变换”的论文的部…