GO语言-数据类型

news2025/4/15 21:13:14

文章目录

  • 变量定义
  • 1. 整数类型
  • 2. 浮点类型
  • 3. 字符类型
  • 4. 布尔类型
  • 5. 字符串类型
    • 5.1 字符串的本质
    • 5.2 常用字符串处理函数(strings包)
    • 5.3 修改字符串的方式
  • 6. 数据默认值
  • 7. 类型转换

变量定义

代码如下:

package main

import "fmt"

var i1 = 1000
var i2 int

var(
	i5 = "hello"
	i6 = "world"
)

func main(){
	var i int
	
	fmt.Println("i = ", i)
	
	i = 10
	fmt.Println("i = ", i)

	var num = 10.01 	
	fmt.Println("num = ", num)

	num = 100.01 	
	fmt.Println("num = ", num)

	Name := "MikeSun"
	fmt.Println("Name = ", Name)

	var n1 , n2 , n3 int
	fmt.Println("n1 = ", n1, "n2 = ", n2, "n3 = ", n3)

	var n4 , name1 , n5 = 100, "MikeSun", 200
	fmt.Println("n4 = ", n4, "name1 = ", name1, "n5 = ", n5)

	n6, name2, n7 := 1000, "joke", 2000
	fmt.Println("n6 = ", n6, "name2 = ", name2, "n7 = ", n7)

	fmt.Println("i1 = ", i1, "i2 = ", i2)
	fmt.Println("i5、i6 = ", i5, i6)
}

1、从main函数上面的全局变量开始分析:
全局变量定义,定义时不声明类型,只定义数值,自动分配类型:
var i1 = 1000
全局变量定义:
var i2 int
全局变量定义,同时定义多个对象:
var(
i5 = “hello”
i6 = “world”
)

2、再来看main函数中的变量定义方式
定义变量不赋值:
var i int
3、对已定义的变量赋值:
i = 10
4、定义变量,不声明类型,默认匹配类型:
var num = 10.01
5、定义并且赋值:
Name := “MikeSun”
上面代码等价于
var Name string
Name = “MikeSun”
6、一次定义多个变量
var n1 , n2 , n3 int
7、一次性定义多个变量并且赋值
var n4 , name1 , n5 = 100, “MikeSun”, 200
8、一次性定义多个变量并且赋值
n6, name2, n7 := 1000, “joke”, 2000

1. 整数类型

类型位数取值范围说明
int32/64-2³¹ 到 2³¹-1(32位)或 -2⁶³ 到 2⁶³-1(64位)平台相关,32位或64位取决于系统
int88-128 到 1278位有符号整数
int1616-32,768 到 32,76716位有符号整数
int3232-2,147,483,648 到 2,147,483,64732位有符号整数(同 rune)
int6464-9,223,372,036,854,775,808 到 9,223,372,036,854,775,80732位有符号整数
int32/640 到 2³²-1(32位)或 0 到 2⁶⁴-1(64位)平台相关,32位或64位取决于系统
uint88-128 到 1278位无符号整数(同byte)
uint1616-32,768 到 32,76716位无符号整数
uint3232-2,147,483,648 到 2,147,483,64732位无符号整数
uint6464-9,223,372,036,854,775,808 到 9,223,372,036,854,775,80732位无符号整数
byte8-128 到 127uint8 的别名,用于字节数据
rune32-2,147,483,648 到 2,147,483,647int32 的别名,表示 Unicode 码点

2. 浮点类型

类型位数取值范围(近似)精度说明
float3232±1.18e⁻³⁸ 到 ±3.4e³⁸6-7位小数单精度浮点数,占用4字节
float6464±2.23e⁻³⁰⁸ 到 ±1.8e³⁰⁸15-16位小数双精度浮点数,占用8字节
代码示例如下:
下面代码有介绍科学计数法、省略整数部分写法。
package main 
import (
	"fmt"
	"reflect"
)

func main(){
	var price float32 = 89.12
	fmt.Println("price = ", price)
	var num1 float32 = -0.00089
	var num2 float64 = -7809656.09

	fmt.Println("num1 = ", num1, "num2 = ", num2)

	//尾部部分精度丢失,造成精度损失
	var num3 float32 = -123.0000901
	var num4 float64 = -123.0000901
	fmt.Println("num3 = ", num3, "num4 = ", num4)

	//Golang的浮点类型默认声明为float64 类型
	var num5 = 1.1
	fmt.Println("typeof num5 is ", reflect.TypeOf(num5))

	//十进制数形式:如:5.12      .512(必须有小数点)
	num6 := 5.12
	num7 := .123
	fmt.Println("num6 = ", num6, "num7 = ", num7)

	//科学计数法
	num8 := 5.1234e2
	num9 := 5.1234E2
	num10 := 5.1234E-2
	fmt.Println("num8 = ", num8, "num9 = ", num9, "num10 = ", num10)
}

3. 字符类型

Go语言统一使用Unicode编码。
字符类型的本质就是一个整数型,一个整数对应Unicode中的一个字符,从而可以使用特地的输出格式输出,如%c。
Unicode编码是包含ASCII码的,所以前面的256个字符仍然可以当作ASCII码来输出或转换。

package main

import (
	"fmt"
)

func main(){
	var c1 byte = 'a'
	var c2 byte = '0'
	
	fmt.Println("c1 = ", c1)
	fmt.Println("c2 = ", c2)

	// 要输出ASCII值必须要格式化输出
	fmt.Printf("c1 = %c c2 = %c", c1, c2)

	var c3 int = '孙'
	fmt.Printf("c3 = %c c3 = %d", c3, c3)

	var c4 int = 22269
	fmt.Printf("\nc4 = %c", c4)

	var c5 int = 65
	fmt.Printf("\nc5 = %c", c5)
}

运行结果:
c1 =  97
c2 =  48
c1 = a c2 = 0c3 = 孙 c3 = 23385
c4 = 国
c5 = A

4. 布尔类型

代码示例如下:

package main
import (
	"fmt"
	"unsafe"
)

func main(){
	var bflag = false
	fmt.Println("bflag = ", bflag)
	//注意事项
	//1.bool类型占用存储空间是1个字节
	fmt.Println("bflag 的占用空间 =  ", unsafe.Sizeof(bflag))
	//2.bool类型只能取true或者false
}

运行结果:
bflag =  false
bflag 的占用空间 =   1

注意:
1、bool类型不能参加±运算,可以参加逻辑运算。

运算符说明示例
&&逻辑与(AND)true && false → false
||逻辑或(OR)true
!逻辑非(NOT)!true → false
错误示例:
b := true
// fmt.Println(b + 1) // 错误:bool 不能参与数学运算

2、Go 是强类型语言,其他类型不能隐式转为 bool

// 错误示例
i := 1
if i { // 编译错误:non-bool i (type int) used as if condition
    fmt.Println("True")
}

3、必须显式比较

b := true
// fmt.Println(b + 1) // 错误:bool 不能参与数学运算

5. 字符串类型

5.1 字符串的本质

1、底层结构:Go 的字符串是一个 只读的字节切片([]byte),存储的是 UTF-8 编码的 Unicode 字符。
2、不可变性:字符串一旦创建,内容不可修改(若需修改需转为 []byte 或 []rune)。

代码示例如下:

package main

import (
	"fmt"
	"reflect"
)

//演示golang中string 的类型使用
func main(){
	var str1 = "北京欢迎您"
	fmt.Println("1、", str1)
	fmt.Println("sizeof(strl) is", len(str1))
	fmt.Println("typeof(strl) is", reflect.TypeOf(str1))

	// 字符串拼接方式
	str1 += "为您开天辟地"
	fmt.Println("2、", str1)

	// 字符串拼接需要换行的时候,需要将操作符,例如+,保留在上面一行否则报错
	str1 += "hello" + "world" +
		    "666"
	fmt.Println("3、", str1)

	// 反引号引用无需转义,原样输出
	str1 = `
	var str1 = "北京欢迎您"
	fmt.Println("1、", str1)
	fmt.Println("sizeof(strl) is", len(str1))
	fmt.Println("typeof(strl) is", reflect.TypeOf(str1))
	`
	fmt.Println("4、", str1)

	// str1[0] = 'A'
}


运行结果:
1、 北京欢迎您
sizeof(strl) is 15
typeof(strl) is string
2、 北京欢迎您为您开天辟地
3、 北京欢迎您为您开天辟地helloworld666
4var str1 = "北京欢迎您"
        fmt.Println("1、", str1)
        fmt.Println("sizeof(strl) is", len(str1))
        fmt.Println("typeof(strl) is", reflect.TypeOf(str1))

5.2 常用字符串处理函数(strings包)

函数说明示例
strings.Contains(s, substr)检查是否包含子串Contains(“Hello”, “ell”) → true
strings.HasPrefix(s, prefix)检查是否以某前缀开头HasPrefix(“Go”, “G”) → true
strings.HasSuffix(s, suffix)检查是否以某后缀结尾HasSuffix(“World”, “ld”) → true
strings.Split(s, sep)按分隔符拆分字符串Split(“a,b,c”, “,”) → [“a”,“b”,“c”]
strings.Join(slice, sep)将字符串切片连接Join([]string{“a”,“b”}, “-”) → “a-b”
strings.ToUpper(s)转为大写ToUpper(“go”) → “GO”
strings.ToLower(s)转为小写ToLower(“GO”) → “go”
strings.TrimSpace(s)去除首尾空白字符TrimSpace(" Hi ") → “Hi”

5.3 修改字符串的方式

若需频繁操作字节/字符,可先转为 []byte 或 []rune:

s := "Hello"
bytes := []byte(s)
bytes[0] = 'h' // 修改后转回字符串
s = string(bytes) // "hello"

6. 数据默认值

Go语言数据默认值均为0(字符串空,nil,false均为0的别名)。

类型默认值(零值)说明
整数类型0包括 int, int8, int16, int32, int64, uint, uint8 等。
浮点类型0.0包括 float32, float64。
布尔类型falsebool 类型的零值。
字符串类型“”(空字符串)
指针类型nil所有指针(如 *int, *string)的零值。
引用类型nil包括 slice(切片)、map(映射)、channel(通道)、func(函数)。
结构体类型所有字段的零值结构体的每个字段会递归初始化为其类型的零值。
数组类型所有元素为对应零值如 var arr [3]int 的零值是 [0, 0, 0]。
接口类型nil接口变量在未赋值时的零值。
错误类型nilerror 类型的零值。
代码示例:
package main

import (
	"fmt"
)


func main(){
	var a int // 0
	var b float32 // 0
	var c float64 // 0
	var d bool // flase
	var name string // ""

	//%v 表示按照变量的值输出
	fmt.Printf("a = %v, b = %v, c = %v, d = %v, name = %v", a, b, c, d, name)
}



运行结果:
a = 0, b = 0, c = 0, d = false, name = 

7. 类型转换

Go语言在不同类型的变量之间赋值时需要显示转换。也就是说Go语言数据类型不会自动转换。
1、强制类型转换既可以从小范围数据类型转换到大范围数据类型(上行转换)、也可以从大范围数据类型转换到小范围数据类型(下行转换)
2、被转换的是变量存储的数据(数值),变量本身的数据类型并没有发生改变
3、在转换中,可能出现意想不到的结果,特别是下行转换的时候。
示例代码如下:
从代码很容易看出转换语法:type(var),这里需要注意,和C语言不同,C语言是(type)var。
当转换溢出时,数据会错误。
如int64的变量转换为int8,则需要取余256.(网上某个培训班网课说无法计算,实际是可计算的,数据溢出之后从0开始,是一个循环)

package main

import (
	"fmt"
)

func main(){

	var i int32 = 100

	var n1 float32 = float32(i)
	var n2 int8 = int8(i)
	var n3 int64 = int64(i)

	fmt.Printf("i = %v n1 = %v n2 = %v n3 = %v", i, n1, n2, n3)

	// 被转换的是变量的数据,而不是变量的类型
	fmt.Printf("i type is %T", i)

	var num1 int64 = 999999
	var num2 int8 = int8(num1)
	fmt.Println("num2 = ", num2)
	num1 = 257
	num2 = int8(num1)
	fmt.Println("num2 = ", num2)
}

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

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

相关文章

设计模式 四、行为设计模式(2)

五、状态模式 1、概述 状态设计模式是一种行为型设计模式,它允许对象在其内部状态发生时改变其行为,这种模式可以消除大量的条件语句,并将每个状态的行为封装到单独的类中。 状态模式的主要组成部分如下: 1)上…

FEA 仿真助力高速连接器设计中的信号完整性

各行各业高速信号软件和硬件的快速发展,带来了更高的频率和带宽。因此,对连接器组件的整体性能要求也更加严格。同时,器件和封装形式、互连以及系统内其他设备的小型化也带来了额外的设计挑战。所有这些都对信号传输完整性产生重大影响。 高速…

yum的基本操作和vim指令

在我们的手机端或者Windows上下载软件,可以在相应的应用商店或者官网进行下载,这样对于用户来说十分的方便和便捷。而在Linux上,也有类似的安装方式,我们来一一了解一下。 Linux安装软件的3种方法 源代码安装 在Linux下安装软件…

Qt触摸屏隐藏鼠标指针

Qt触摸屏隐藏鼠标指针 Chapter1 Qt触摸屏隐藏鼠标指针 Chapter1 Qt触摸屏隐藏鼠标指针 使用Qt开发的屏幕软件HMI不需要显示鼠标,qt设置,可以在只启动HMI的时候隐藏光标,退出时再显示。 1.如果只希望在某个 widget 中不显示鼠标指针&#xf…

LangGraph——Agent AI的持久化状态

LangGraph 内置了一个持久化层,通过检查点(checkpointer)机制实现。当你使用检查点器编译图时,它会在每个超级步骤(super-step)自动保存图状态的检查点。这些检查点被存储在一个线程(thread)中,可在图执行后随时访问。由于线程允许在执行后访…

【双指针】专题:LeetCode 1089题解——复写零

复写零 一、题目链接二、题目三、算法原理1、先找到最后一个要复写的数——双指针算法1.5、处理一下边界情况2、“从后向前”完成复写操作 四、编写代码五、时间复杂度和空间复杂度 一、题目链接 复写零 二、题目 三、算法原理 解法:双指针算法 先根据“异地”操…

【C++初学】C++核心编程(一):内存管理和引用

前言 在C的世界里,面向对象编程(OOP)是核心中的核心。它不仅是一种编程范式,更是一种思考问题的方式。本文将带你从C的内存分区模型出发,深入探讨引用、函数、类和对象、继承、多态以及文件操作等核心概念。通过丰富的…

(PC+WAP)大气滚屏网站模板 电气电力设备网站源码下载

源码介绍 (PCWAP)大气滚屏网站模板 电气电力设备网站源码下载。PbootCMS内核开发的网站模板,该模板适用于滚屏网站模板、电气电力设备网站源码等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的即可;PCWAP&#xff0c…

笔试专题(九)

文章目录 十字爆破(暴力)题解代码 比那名居的桃子(滑动窗口/前缀和)题解代码 分组(暴力枚举 优化二分)题解代码 十字爆破(暴力) 题目链接 题解 1. 暴力 预处理 2. 如果单纯的暴…

3 VS Code 配置优化与实用插件推荐:settings.json 详解、CodeGeeX 智能编程助手及插件离线安装方法

1 优化 settings.json 文件 1.1 settings.json 简介 settings.json 是 VS Code 的核心配置文件,用于存储用户的个性化设置和偏好。通过该文件,用户可以自定义和覆盖 VS Code 的默认行为,包括但不限于以下方面: 编辑器外观&#…

TA学习之路——1.6 PC手机图形API介绍

1前言 电脑的工作原理:电脑是由各种不同的硬件组成,由驱动软件驱使硬件进行工作。所有的软件工程师都会直接或者间接的使用到驱动。 定义:是一个图形库,用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序接口(API)。…

Matlab 调制信号和fft变换

1、内容简介 Matlab 194-调制信号和fft变换 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

100M/1000M 以太网静电浪涌防护方案

方案简介 以太网是一种生产较早且广泛应用的局域网通讯方式,同时也是一种协议,其核 心在于实现区域内(如办公室、学校等)的网络互联。根据数据传输速度的不同,以 太网大致可以划分为几个等级:标准以太网…

C语言中while的相关题目

一、题目引入 以下程序中,while循环的循环次数是多少次? 二、代码分析 首先要明确的一点 while循环是当循环条件为真 就会一直循环 不会停止 while中i是小于10的 说明i可以取到0 1 2 3 4 5 6 7 8 9 进入第一个if判断i小于1为真时执行continue i0是为真的 执行continue 后…

「Unity3D」图片导入选项取消Read/Write,就无法正确显示导入大小,以及Addressable打包无法正确显示的问题

如果在Edit -> Project Settings -> Editor中的“Load texture data on demand”勾选,就会让图片导入设置中,不勾选Read/Write,就无法正确显示纹理的大小数字。 更进一步的问题是,使用Addressable打包的时候, 如…

Xcode为不同环境配置不同的环境变量

一般有三种方式: 一、通过多Target 二、通过scheme,也就是多configurations 三、通过.xcconfig文件 先来看第二种方式:通过scheme,也就是多configurations,包括自定义User-settings 第一步:增加configurations,Xcode默认为我们生成了…

阿里通义实验室发布图片数字人项目LAM,实现高保真重建

简介 LAM项目结合了3D Gaussian Splatting(高斯点云渲染)和大规模预训练模型的优势,解决了传统头部重建方法效率低、依赖多数据的痛点。其背景源于AI生成内容(AIGC)领域对实时、高保真3D头像生成的需求,尤其…

镜像端口及观察端口的配置

配好路由器的各个接口的IP PC1ping PC3的IP,在路由器中抓2/0/0端口的包,可观察到无结果 输入observe-port interface g 2/0/0 命令配置观察端口 输入mirror to observe-port both命令 (其中both表示接收来去的数据包,inboun…

STM32——I2C通讯(软件模拟)

I2C概念 I2C:Inter-Integrated Circuit(内部集成电路) Philps公司80年代初期开发的,引脚少,硬件实现简单,可扩展性广泛地使用在系统内多个集成电路(IC)间的低速通讯 简单的双向两线制总线协议…

JetBrains Terminal 又发布新架构,Android Studio 将再次迎来新终端

不到一年的时间,JetBrains 又要对 Terminal 「大刀阔斧」,本次发布的新终端是重构后的全新的架构,而上一次终端大调整还是去年 8 月的 v2024.2 版本,并且在「Android Studio Ladybug | 2024.2.1」也被引入。 不知道你们用不用内置…