Go学习第二章——变量与数据类型

news2024/9/24 9:22:16

Go变量与数据类型

      • 1 变量
        • 1.1 变量概念
        • 1.2 变量的使用步骤
        • 1.3 变量的注意事项
        • 1.4 "+"的使用
      • 2 数据类型介绍
      • 3 整数类型
        • 3.1 有符号整数类型
        • 3.2 无符号整数类型
        • 3.3 其他整数类型
        • 3.4 整型的使用细节
      • 4 小数类型/浮点型
        • 4.1 浮点型的分类
        • 4.2 简单使用
      • 5 字符类型
        • 5.1 字符类型的使用
        • 5.2 转义字符
        • 5.3 字符使用的注意事项
      • 6 布尔类型
      • 7 字符串类型
        • 7.1 基本使用
        • 7.2 string使用注意事项
      • 8 基本数据类型的转换
        • 8.1 基本使用
        • 8.2 基本数据类型转化为string类型
        • 8.3 string类型转化为基本数据类型

1 变量

1.1 变量概念

变量相当于内存中一个数据存储空间的表示

1.2 变量的使用步骤

(1)声明变量(也叫:定义变量)

(2)非变量赋值

(3)使用变量

在这里插入图片描述

1.3 变量的注意事项

(1)变量表示内存中的一个存储区域

(2)该区域有自己的名称(变量名)和类型(数据类型)

在这里插入图片描述

(3)Golang变量使用的三种方式

  • 第一种:声明后不赋值,使用默认值,例如:int数据类型默认值为 ‘0’
func main() {
	// 声明不赋值,int数据类型默认值为 0
	var i int
	fmt.Println("i=", i)
}
  • 第二种:根据值自行判断变量类型(类型推导,自动判断)
func main() {
	// 根据自行判定变量类型(类型推导,自动判断)
	var num = 10.11
	fmt.Println("num=", num)
}
  • 第三种:省略var,注意: = 左侧的变量不应该是已经声明过的,否则会导致编译错误
func main() {
	// 第三种:省略var,等价于 var name string, name = "tom"
	num := "tom"
	fmt.Println("num=", num)
}

(4)多变量声明

一次性声明多个变量

func main() {
	// 对应上面第一种方式
	var a1, a2, a3 int
	fmt.Println("a1=", a1, "a2=", a2, "a3=", a3)
	// 对应上面第二种方式
	var b1, b2, b3 = 100, "tom", 888
	fmt.Println("b1=", b1, "b2=", b2, "b3=", b3)
	// 对应上面第三种方式
	c1, c2, c3 := 100, "tom", 888
	fmt.Println("c1=", c1, "c2=", c2, "c3=", c3)
}

(5)全局变量的声明

package main

// 定义全局变量
var n1 = 100
var n2 = 200
var n3 = "Tom"

// 一次性声明
var (
	n4 = 300
	n5 = "Mary"
)

func main() {
	// 注意:这里声明的变量和全局变量不能名字重复,
	// var n1 = 1000
	// 相当于把全局变量的n1值给修改
	n1 = 1000
	println("n1=", n1, "n2=", n2, "n3=", n3, "n4=", n4, "n5=", n5)
}

(6)该区域的数据值可以在同一数据类型范围内重复赋值(变化,修改)

func main() {
	var i int
	i = 1
	i = 2
	i = 3
	fmt.Println(i)
	// i = 1.1 报错:数据类型不同
}

(7)变量在同一个作用域(在一个函数或者在代码块)内不能重名

func main() {
	var i int
	i = 1
	// var i int 报错:重名
	// i := 2 报错:同上,因为这个是两个语句的合体
	fmt.Println("i=", i)
}

(8)变量=变量名+值+数据类型,注意这是变量的三要素

(9)Golang的变量如果没有赋初值,编译器会使用默认值,比如int默认值 0 , string默认值 空串,小数默认值 0

1.4 "+"的使用
  • 当左右两边都是数值型时,做加法运算
  • 当左右两边都是字符串时,做字符串拼接
func main() {
	var a, b = 1, 2
	fmt.Println("a+b=", a+b)
	var n1, n2 = "你", "好"
	fmt.Println("n1+n2=", n1+n2)
}

2 数据类型介绍

每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间

下面是主要和常用的数据类型

不过少了rune(int32的别名,表示一个Unicode码,处理带中文的字符串)和complex64,128(复数数据类型)

在这里插入图片描述

区别于java,不使用short等来区分内存空间大小,例如:int8 占用8位,也就是1个byte

注意:

  1. 没有字符型char这种数据类型,使用byte存储时,只能存字母,不能存单个汉字

  2. string 在go语言属于基本数据类型

3 整数类型

简单的说,就是用于存放整数值的,比如10,-45,6712等等。

3.1 有符号整数类型

在这里插入图片描述

PS:127怎么算出来的?

01111111 -->二进制 —》转为十进制:
12^6 + 12^5 + 12^4 + 12^3 + 12^2 + 12^1 + 1*2^0
= 64 + 32 + 16 + 8 + 4 + 2 + 1
= 127

PS:-128怎么算出来的?
10000000 —>二进制 —>一看就是个负数

进行负数的二进制计算

减1:01111111
取反:10000000 —》得到一个正数 2^7 = 128
加负号:-128

3.2 无符号整数类型

在这里插入图片描述

表数范围的边界计算:
11111111= 2^7+127 = 128 + 127 = 255
00000000 = 0

3.3 其他整数类型

在这里插入图片描述

3.4 整型的使用细节
  1. Golang各整数类型分为:有符号和无符号,int uint 的大小和系统有关

  2. Golang的整数类型,默认声明为int类型

func main() {
	var a = 1
	// fmt.Printf()可以用于做格式化输出
	fmt.Printf("a 的数据类型:%T", a)
    // 输出:a 的数据类型:int
}
  1. 如何在程序查看某个遍历的占用字节大小和数据类型(使用较多)
func main() {
	var n1 byte = 10
	// fmt.Printf()可以用于做格式化输出
	// unsafe.Sizeof(a) 是unsafe包的一个函数,可以返回n1变量占用的字节数
	fmt.Printf("n1 的数据类型:%T ,n1占用的字节数是 %d ", n1, unsafe.Sizeof(n1))
    // 输出:n1 的数据类型:uint8 ,n1占用的字节数是 1
}
  1. Golang程序中整型变量在使用时,遵守保小不保大的原则,即:在保证程序正确运行下,尽量使用占用空间小的数据类型。如:年龄,可以使用byte,就占用一个字节
  2. bit:计算机中的最小存储单位。byte:计算机中基本存储单元。一个byte = 8bit

4 小数类型/浮点型

简单的说,就是用于存放小数值的,比如3.14、0.28、-7.19等等。

4.1 浮点型的分类

在这里插入图片描述

PS: 底层存储空间和操作系统无关
PS:浮点类型底层存储:符号位+指数位+尾数位,所以尾数位只是存了 一个大概,很可能会出现精度的损失。

4.2 简单使用
func main() {
	num1 := 5.12
	num2 := 0.12
    // 科学计数法的使用
	num3 := 5.1234e2 // 5.1234 * 10的2次方
	fmt.Println("num1=", num1, "num2=", num2, "num3=", num3)
	// 输出:num1= 5.12 num2= 0.12 num3= 512.34
	fmt.Printf("num3的数据类型: %T", num3)
	// 输出:num3的数据类型: float64
}

注意:推荐使用float64

5 字符类型

5.1 字符类型的使用
  1. Golang中没有专门的字符类型,如果要存储单个字符(字母),一般使用byte来保存。
  2. Golang中字符使用UTF-8编码
func main() {
	var a byte = 'a'
	var b byte = '0'
	fmt.Println("a = ", a, ",b = ", b)
	// 输出:a =  97 ,b =  48
}

ASCII码表:
左面是不可见字符 右面是可见字符

在这里插入图片描述

  1. 如果我们需要输出对应字符,需要使用格式化输出
func main() {
    var a byte = 'a'
    var b byte = '0'
    fmt.Printf("a = %c ,b = %c", a, b)
    // 输出:a = a ,b = 0
}
  1. 输出汉字的方式
func main() {
    //var a byte = '北' // overflow溢出
    var a int = '北'
    fmt.Printf("a=%c,a对应码值=%d", a, a)
}
5.2 转义字符

\转义字符:将后面的字母表示为特殊含义

在这里插入图片描述

5.3 字符使用的注意事项
  1. 字符常量是用单引号''括起来的单个字符
  2. Go语言的字符使用UTF-8编码 英文字母1个字节,汉字3个字节
  3. 字符的本质是一个整数,直接输出时,是该字符对应的UTF-8编码码值
  4. 格式化输出%C,会输出该数字对应的unicode字符
  5. 字符类型是可以进行运算的,相当于一个整数,因为它都对应有Unicode

PS:字符型 存储到 计算机中

  • 存储:字符 -> 对应码值 -> 二进制 -> 存储
  • 读取:二进制 -> 码值 -> 字符 -> 读取

PS:GO语言的编码都统一成了utf-8。非常的方便,很统一,再也没有编码乱码的困扰了。

6 布尔类型

  1. 布尔类型也叫bool类型,bool类型数据只允许取值truefalse
  2. 布尔类型占1个字节。
  3. 布尔类型适于逻辑运算,一般用于程序流程控制
func main() {
	var n = false // 不允许使用 0,1
	fmt.Println("n =", n)
}

7 字符串类型

7.1 基本使用

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

func main() {
    var address string = "北京长城 110 hello world"
    fmt.Println("address = " + address)
    // 输出:address = 北京长城 110 hello world
}
7.2 string使用注意事项
  1. Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使用UTF-8编码标识Unicode文本,这样Golang统一使用UTF-8编码,中文乱码问题不会再困扰程序员。
  2. 字符串一单赋值了,字符串就不能修改了:在Go中字符串是不可变的
func main() {
    var address string = "北京长城 110 hello world"
    // address[0] = '哈' // 报错!不能修改!
    fmt.Println("address = ", address)
}
  1. 字符串的两种表示形式
  • 双引号,会识别转义字符
  • 反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果

8 基本数据类型的转换

8.1 基本使用

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

语法:
表达式T(v)将值v转换为类型T
T : 就是数据类型
v : 就是需要转换的变量

func main() {
    var n1 int32 = 100
    // var n2 float32 = n1 报错
    var n2 float32 = float32(n1)
    fmt.Printf("n1 = %v n2 = %v ", n1, n2)
}

**注意:**转换的结果如果超出范围,就会按照溢出处理,不会编译错误,只是会和我们希望的结果不一样。

8.2 基本数据类型转化为string类型

在程序开发中,我们经常需要将基本数据类型转成string类型。或者将string类型转成基本数据类型。
基本类型转string类型的两种方式
方式1:fmt.Sprintf(“%参数”,表达式) —》 重点练习这个,推荐方式
方式2:使用strconv包的函数

方式1 代码演示:

import "fmt"

func main() {
    var num1 int = 99
    var str1 string = fmt.Sprintf("%d", num1)
    fmt.Printf("str1 type:%T, str1 = %v", str1, str1)

    fmt.Println()

    var num2 float64 = 23.456
    str2 := fmt.Sprintf("%f", num2)
    fmt.Printf("str2 type:%T, str2 = %v", str2, str2)

    fmt.Println()

    var b bool = true
    str3 := fmt.Sprintf("%t", b)
    fmt.Printf("str3 type:%T, str3 = %v", str3, str3)

    fmt.Println()

    var myChar byte = 'h'
    str4 := fmt.Sprintf("%b", myChar)
    fmt.Printf("str4 type:%T, str4 = %v", str4, str4)
}

输出:

str1 type:string, str1 = 99
str2 type:string, str2 = 23.456000
str3 type:string, str3 = true
str4 type:string, str4 = 1101000

方式2 代码演示:

func main() {
    var num1 int = 99
    // 表示10进制
	str1 := strconv.FormatInt(int64(num1), 10) 
	// str1 := strconv.Itoa(num1) 同上
	fmt.Printf("str1 type:%T, str1 = %v\n", str1, str1)

    var num2 float64 = 23.456
    // 'f' 格式 10:表示小数位保留10位 64 表示是float64
    str2 := strconv.FormatFloat(num2, 'f', 10, 64) 
    fmt.Printf("str2 type:%T, str2 = %v\n", str2, str2)

    var b bool = true
    str3 := strconv.FormatBool(b)
    fmt.Printf("str3 type:%T, str3 = %v\n", str3, str3)

    var myChar byte = 'h'
    // str4 := strconv.FormatInt(int64(myChar), 2)
    str4 := string(myChar)
    fmt.Printf("str4 type:%T, str4 = %v\n", str4, str4)
}

输出:

str1 type:string, str1 = 99
str2 type:string, str2 = 23.456000
str3 type:string, str3 = true
str4 type:string, str4 = h
8.3 string类型转化为基本数据类型
func main() {
    // 说明:num1, _ := strconv.ParseInt() 表示忽略第二个函数的返回值,使用下划线"_"

    str1 := "99"
    // num1, _ := strconv.Atoi(str1) // 与下面这个相同
    num1, _ := strconv.ParseInt(str1, 10, 64) // 只能转化为int64,但是不能为int类型,int类型只能用上面这个
    fmt.Printf("num1 type:%T, num1 = %v\n", num1, num1)

    str2 := "23.456"
    num2, _ := strconv.ParseFloat(str2, 64)
    fmt.Printf("num2 type:%T, num2 = %v\n", num2, num2)

    str3 := "true"
    b, _ := strconv.ParseBool(str3)
    fmt.Printf("b type:%T, b = %v\n", b, b)

    str4 := "h"
	// myChar2 := str4[0] 结果与下面这个相同
	myChar := byte(str4[0])
	fmt.Printf("myChar type:%T, myChar = %v\n", myChar, myChar)
}

输出为:

num1 type:int64, num1 = 99
num2 type:float64, num2 = 23.456
b type:bool, b = true
myChar type:uint8, myChar = 104

注意事项:

确保转换之间的数据类型没有问题,不然Golang不会报错,但是数据是当前数据类型的默认值

可以把“123”转为一个整数,但不能把“hello”转成一个整数,如果这样做,Golang直接将其转成默认值 0

例子:

func main() {
    var str string = "hello"
    var num int64
    num, _ = strconv.ParseInt(str, 10, 64)
    fmt.Printf("num type = %T, num value = %d \n", num, num)
    // 输出为:num type = int64, num value = 0
}

Over!!!!下一步学习Go指针,冲冲冲!!!

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

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

相关文章

【LeetCode】 412. Fizz Buzz

题目链接 文章目录 Python3 【O(n) O(1)】C.emplace_back() 【C 11 之后】 Python3 【O(n) O(1)】 初始版本 class Solution:def fizzBuzz(self, n: int) -> List[str]:ans []for i in range(1, n1):if i % 5 0 and i % 3 0:ans.append("FizzBuzz")elif i % …

【三:Mock服务的使用】

目录 1、工具包2、mock的demo1、get请求2、post请求3、带cookies的请求4、带请求头的请求5、请求重定向 1、工具包 1、:服务包的下载 moco-runner-0.11.0-standalone.jar 下载 2、:运行命令java -jar ./moco-runner-0.11.0-standalone.jar http -p 888…

【Qt控件之微调框、进度条】QSpinBox、QDoubleSpinBox、QDial、QProgressBar介绍及使用

概述 QSpinBox类提供了一个微调框小部件。 QSpinBox适用于处理整数和离散的值集(例如,月份名称);对于浮点数值,请使用QDoubleSpinBox。 QSpinBox允许用户通过点击上下按钮或按键盘上的上下箭头来增加/减少当前显示的值…

【交互式分割】——数据可视化

ritm, 交互式分割 数据可视化 数据包括一张图片 正样本点 负样本点 二分类的mask标签 如何模拟多次点击的迭代过程?

ubuntu18.04 RTX3060 rangnet++训练

代码链接: https://github.com/PRBonn/lidar-bonnetal 安装anaconda环境为 CUDA 11.0(11.1也可以) anaconda环境如下 numpy1.17.2 torchvision0.2.2 matplotlib2.2.3 tensorflow1.13.1 scipy0.19.1 pytorch1.7.1 vispy0.5.3 opencv_python…

【Qt控件之QListWidget】介绍及使用,利用QListWidget、QToolButton、和布局控件实现抽屉式组合控件

概述 QListWidget类提供了基于项目的列表小部件。 QListWidget是一个方便的类,类似于QListView提供的列表视图,但使用经典的基于项目的接口来添加和删除项目。QListWidget使用内部模型来管理列表中的每个QListWidgetItem。 对于更灵活的列表视图小部件…

DVWA-impossible代码审计

文章目录 DVWA靶场—impossible代码审计1.暴力破解(Brute Force)1.1 代码审计1.2 总结 2.命令注入(Command Injection)2.1 代码审计2.2 总结 3.跨站请求伪造(CSRF)3.1 代码审计3.2 总结 4.文件包含漏洞&…

数据挖掘原理与算法

一、什么是闭合项集? Close算法对Apriori算法的改进在什么地方? 闭合项集:就是指一个项集x,它的直接超集的支持度计数都不等于它本身的支持度计数。 改进的地方: 改进方向: 加速频繁项目集合的生成,减少数据库库的扫…

数字秒表VHDL实验箱精度毫秒可回看,视频/代码

名称:数字秒表VHDL精度毫秒可回看 软件:Quartus 语言:VHDL 代码功能: 数字秒表的VHDL设计,可以显示秒和毫秒。可以启动、停止、复位。要求可以存储6组时间,可以回看存储的时间 本资源内含2个工程文件&am…

Systemverilog断言介绍(二)

3.2 IMMEDIATE ASSERTIONS 即时断言是最简单的断言语句类型。它们通常被认为是SystemVerilog过程代码的一部分,并在代码评估期间访问时进行评估。它们没有时钟或复位的概念(除非有时钟/复位控制其封闭的过程块),因此无法验证跨越时…

【无标题】光伏逆变器的IEC62109测试,逆变器IEC62109测试项目

光伏逆变器的IEC62109测试,逆变器IEC62109测试项目 逆变器又称电源调整器,根据逆变器在光伏发电系统中的用途可分为独立型电源用和并网用二种。根据波形调制方式又可分为方波逆变器、阶梯波逆变器、正弦波逆变器和组合式三相逆变器。对于用于并网系统的…

基于springboot汽车租赁系统

功能如下图所示 摘要 Spring Boot汽车租赁系统的设计旨在满足不断增长的租车市场需求,并通过简化开发和部署流程来提供方便的租车解决方案。系统采用了现代化的架构,主要基于以下技术栈: Spring Boot:作为后端的核心框架&#xff…

VMware——VMware17安装WindowServer2012R2环境(图解版)

目录 一、WindowServer2012R2镜像百度云下载二、安装 一、WindowServer2012R2镜像百度云下载 下载链接:https://pan.baidu.com/s/1TWnSRJTk0ruGNn4YinzIgA 提取码:e7u0 二、安装 打开虚拟机,点击【创建新的虚拟机】,如下图&…

【Java基础面试二十六】、说一说String和StringBuffer有什么区别

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:说一说String和StringBu…

C++项目——云备份-①-项目介绍环境搭建

文章目录 专栏导读1.什么是云备份2.实现目标3.服务端程序负责功能4.服务端功能模块划分5.客户端程序负责功能6.客户端功能模块划分开发环境环境搭建1. gcc 升级7.3版本2.安装 jsoncpp 库3.下载bundle数据压缩库4.下载 httplib 库 专栏导读 🌸作者简介:花…

【Solution】商品秒杀之Redis缓存与MQ异步优化以及超卖一人一单等问题的解决

目录 一、Demo开始前准备 1、数据库准备 2、项目准备 3、全局唯一id生成器 二、秒杀业务基本实现 1、秒杀基本业务逻辑 2、秒杀接口设计 3、秒杀业务代码实现 4、超卖问题产生 三、保证线程安全解决超卖少卖问题 1、超卖产生的原因 2、加锁方案:乐观锁 …

Go 函数的健壮性、panic异常处理、defer 机制

Go 函数的健壮性、panic异常处理、defer 机制 文章目录 Go 函数的健壮性、panic异常处理、defer 机制一、函数健壮性的“三不要”原则1.1 原则一:不要相信任何外部输入的参数1.2 原则二:不要忽略任何一个错误1.3 原则三:不要假定异常不会发生…

【Linux】如何判断RS-232串口是否能正常使用

1.RS-232串口短接 使用RS-232协议的串口引脚一般如图下所示 为了让串口能够接收到自己发出的串口数据,需要将输出端和输入端(RXD和TXD)进行短接操作: 短接完成后,才能实现自发自收的功能(走其他协议的串口清…

开发者职场“生存状态”大调研报告分析 - 第四版

听人劝、吃饱饭,奉劝各位小伙伴,不要订阅该文所属专栏。 作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 跨域学习者,从事过全栈研发、产品经理等工作,现任研发部门 CTO 。荣誉:2022年度博客之星Top4、博客专家认证、全栈领域优质创作者、新星计划导师,“星荐官共赢计…

Swift使用Embassy库进行数据采集:热点新闻自动生成器

概述 爬虫程序是一种可以自动从网页上抓取数据的软件。爬虫程序可以用于各种目的,例如搜索引擎、数据分析、内容聚合等。本文将介绍如何使用Swift语言和Embassy库编写一个简单的爬虫程序,该程序可以从新闻网站上采集热点信息,并生成一个简单…