Go语言学习Day3:数据类型、运算符与流程控制

名人说:莫愁千里路,自有到来风。 ——钱珝
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)

目录

      • 1、数据类型
        • ①布尔类型
        • ②整型
        • ③浮点型
        • ④string
        • ⑤类型转换
      • 2、运算符
        • ①算术运算符
        • ②逻辑运算符
        • ③关系运算符
        • ④位运算符
        • ⑤赋值运算符
        • ⑥其它运算符
      • 3、流程控制
        • ①if(选择)
        • ②switch(选择)
        • ③for(循环)
        • ④break & continue
      • 4、总结

1、数据类型

①布尔类型

bool,表示逻辑值,可以是truefalse,例如一道判断读错的题,对就打√,错则写×,而这里的√就是true,×其实就是false,计算机里也一样,二进制,用0、1来代表对错,开关。

var isRight bool = true
if isRight {fmt.Println("正确")
} else {fmt.Println("错误")
}

案例:布尔型

//创作者:Code_流苏(CSDN)
package mainimport "fmt"func main() {//var 变量名 数据类型//bool: true false//bool 默认值为falsevar isFlag bool = truevar isFlag2 bool = falsefmt.Println(isFlag)//%T 用于输出一个值的类型//%t 用于格式化布尔值 如果有一个布尔型变量 b,使用 fmt.Printf("%t", b) 会输出 b 的值为 true 或 false。fmt.Printf("%T,%t\n", isFlag, isFlag)fmt.Printf("%T,%t\n", isFlag2, isFlag2)
}

image-20240326144134286

②整型

整型包括intint8int16int32int64以及它们的无符号版本uintuint8uint16uint32uint64。其中没有明确大小的intuint的大小依赖于执行程序的操作系统。

咱们常用的主要是int,例如一个人的年龄,年龄多大,这个数一般就是整型,整数:

var age int = 18
fmt.Println("年龄:", age)
③浮点型

float32float64,分别对应IEEE 754标准的单精度和双精度浮点数,这两个是咱们日后学习中常用的。

例如,咱们日常生活中常常会谈及身高问题,而身高按米来算的话往往就会涉及小数部分,此时就可以使用浮点数来进行这些数据的处理。

var height float64 = 1.75
fmt.Println("身高:", height)

案例:整型与浮点型。

package mainimport "fmt"func main() {//定义一个整型//byte uint8//rune int32//int int64var age int = -200fmt.Printf("%T,%d\n", age, age)//定义一个浮点型//默认是6位小数打印 3.140000var money float64 = 3.19fmt.Printf("%T,%.1f\n", money, money)var num1 float32 = -123.0000901var num2 float64 = -123.0000901fmt.Println("num1 = ", num1, "num2 = ", num2)
}

image-20240326144642188

④string

string,表示文本数据,相当于C++、Java里面的字符串类型。

案例:string类型。

package mainimport "fmt"func main() {var str stringstr = "Hello,yueliusu"fmt.Printf("%T,%s\n", str, str)// 单引号 字符,整型-ASCII字符码v1 := 'A'v2 := "A"//编码表 ASCII码表//扩展://所有的中国字的编码表:GBK//全世界的编码表:Unicodefmt.Printf("%T,%d\n", v1, v1) //int32,65fmt.Printf("%T,%s\n", v2, v2)//字符串连接 +fmt.Println("hello" + ",liusu")//转义字符\fmt.Println("hello\"liusu")fmt.Println("hello\nliusu") // n 换行符fmt.Println("hello\tliusu") // t制表符
}

image-20240326153058245

⑤类型转换

Go语言中要求显式的类型转换,使用形式如T(v)将值v转换为类型T,也就是你如果要转换类型,要给出指定的类型然后加()来转换。例如,将int类型的数据转换成float64类型。

var integer int = 10
var floatNumber float64 = float64(integer)
fmt.Println("转换后的浮点数:", floatNumber)

案例:int与float64之间的类型转换。

package mainimport "fmt"func main() {a := 3   //intb := 5.0 //float64//需求:将int类型的a转换为float64类型 类型转换c := float64(a)d := int(b)//整型是不能转化为bool类型的//e := bool(a)fmt.Printf("%T\n", a)fmt.Printf("%T\n", b)fmt.Printf("%T\n", c)fmt.Printf("%T\n", d)
}

image-20240326153116694

需要注意的是,有些类型是不能相互转换的。

2、运算符

①算术运算符

算术运算符就是咱们日常所见到的加减乘除等 ,用符号表示就是:+-*/%等。

例如,5加2等于几?

fmt.Println("5 + 2 =", 5+2) //5 + 2 = 7

案例:算术运算

package mainimport "fmt"func main() {var a int = 10var b int = 3//算术运算符:+ - * / % ++ --fmt.Println(a + b)fmt.Println(a - b)fmt.Println(a * b)fmt.Println(a % b)a++            // a++ 等同于 a = a + 1fmt.Println(a) // 10 + 1 = 11a--            //a-- 等同于 a = a - 1fmt.Println(a) // 11 - 1 = 10a = 100a--fmt.Println(a) // 100 - 1 = 99
}

image-20240326155709260

②逻辑运算符

逻辑运算符,顾名思义,重在思维逻辑,与或非,对应符号与表达:&&(AND)、||(OR)、!(NOT),与的意思就是只有大家一起努力,这个项目才能完成,非的意思是,这个项目只要有人能完成,不论多少人,这个项目就是完成,非的意思就很明显了,非真即假。

例如,true与false

fmt.Println("true && false =", true && false) //false

案例:逻辑运算

package mainfunc main() {var a bool = falsevar b bool = true//逻辑与&& 同时为真println(a && b)//逻辑或|| 一个为真就成立println(a || b)//逻辑非,真为假,假为真println(!a)
}

image-20240326160218259

③关系运算符

关系运算符,重点在关系,既然涉及到关系,必然涉及的多者,比如1与2,张三与李四,男生与女生等等,常用的关系运算符有:==!=<<=>>=

例如,比较5与2的大小。

fmt.Println("5 > 2 =", 5 > 2) //true

案例:11与10关系运算

package mainimport "fmt"func main() {var a int = 11var b int = 10//关系运算符 == != > < >= <=fmt.Println(a == b) //falsefmt.Println(a != b) //truefmt.Println(a < b)  //falsefmt.Println(a > b)	//truefmt.Println(a >= b)	//truefmt.Println(a <= b) //false}

image-20240326161156051

④位运算符

通过学习计组、操作系统,我们可以知道位运算是什么,因为计算机存储数据就是用的二进制01代码,而常说的一个二进制位,就是这里的位,位运算,也就是操控这些来进行的计算。对应的位运算符有:&(与 AND)、|(或 OR)、^(异或 XOR)、<<(左移)、>>(右移)。

详细来看,Go 语言支持的位运算符如下表所示。例如 A 为60,B 为13:

运算符描述实例
&按位与运算符"&"是双目运算符。都是1结果为1,否则是0(A & B) 结果为 12, 二进制为 0000 1100
|按位或运算符"|"是双目运算符。 都是0结果为0,否是是1(A | B) 结果为 61, 二进制为 0011 1101
^按位异或运算符"^"是双目运算符。 不同则为1,相同为0(A ^ B) 结果为 49, 二进制为 0011 0001
&^位清空,a &^ b,对于b上的每个数值,如果为0,则取a对应位上的数值,如果为1,则取0.(A &^ B) 结果为 48, 二进制为 0011 0000
<<左移运算符"<<“是双目运算符。左移n位就是乘以2的n次方。 其功能把”<<“左边的运算数的各二进位全部左移若干位,由”<<"右边的数指定移动的位数,高位丢弃,低位补0。A << 2 结果为 240 ,二进制为 1111 0000
>>右移运算符">>“是双目运算符。右移n位就是除以2的n次方。 其功能是把”>>“左边的运算数的各二进位全部右移若干位,”>>"右边的数指定移动的位数。A >> 2 结果为 15 ,二进制为 0000 1111

又如5与2:

fmt.Println("5 & 2 =", 5&2) //0,解释:5的4位二进制为0101,2的4位2进制位0010,两者做&运算,结果为0000,也就是0。

案例:位运算

package mainimport "fmt"func main() {//60的二进制 0011 1100var a uint = 60//13的二进制 0000 1101var b uint = 13//位运算var c uint = 0//按位与 & 同1则1,其余为0c = a & b//0011 1100//0000 1101//0000 1100 = 12fmt.Printf("%d,二进制形式为:%b \n", c, c)//按位或 | 同0则0,其余为1c = a | b//0011 1100//0000 1101//0011 1101 = 61fmt.Printf("%d,二进制形式为:%b \n", c, c)//按位异或 ^ 不同为1,相同为0c = a ^ bfmt.Printf("%d,二进制形式为:%b \n", c, c)//按位清空 &^ 对于b上的每位数值,若为0,则取a对应位上的数值,若为1,则取0c = a &^ bfmt.Printf("%d,二进制形式为:%b \n", c, c)//左移运算符 << 为双目运算符,左移n位就是乘以2的n次方c = a << 2fmt.Printf("%d,二进制形式为:%b \n", c, c)//右移运算符 >> 为双目运算符,右移n位就是除以2的n次方c = a >> 2fmt.Printf("%d,二进制形式为:%b \n", c, c)
}

image-20240326161756402

⑤赋值运算符

赋值运算符,类似于超市里有很多商品,需要赋予这些商品价值,而价值也可以通过价格来体现,价格就看做所赋予的值。赋值运算符常见的有:=+=-=*=/=等。

运算符描述实例
=简单的赋值运算符,将一个表达式的值赋给一个左值C = A + B 将 A + B 表达式结果赋值给 C
+=相加后再赋值C += A 等于 C = C + A
-=相减后再赋值C -= A 等于 C = C - A
*=相乘后再赋值C *= A 等于 C = C * A
/=相除后再赋值C /= A 等于 C = C / A
%=求余后再赋值C %= A 等于 C = C % A
<<=左移后赋值C <<= 2 等于 C = C << 2
>>=右移后赋值C >>= 2 等于 C = C >> 2
&=按位与后赋值C &= 2 等于 C = C & 2
^=按位异或后赋值C ^= 2 等于 C = C ^ 2
|=按位或后赋值C |= 2 等于 C = C | 2

例如,10+5

var a int = 10
a += 5
fmt.Println("a =", a) //15

案例:赋值运算

package mainimport "fmt"func main() {var a int = 21var c int// 赋值运算符"=" 将等号右边的值 赋值给左边c = afmt.Printf("第1行:= c的值为:%d\n", c)c += afmt.Printf("第2行:+= c的值为:%d\n", c)c -= afmt.Printf("第3行:-= c的值为:%d\n", c)c *= afmt.Printf("第4行:*= c的值为:%d\n", c)c /= afmt.Printf("第5行:/= c的值为:%d\n", c)c = 200c <<= 2fmt.Printf("第6行:<<= c的值为:%d\n", c)c >>= 2fmt.Printf("第7行:>>= c的值为:%d\n", c)c &= 2fmt.Printf("第8行:&= c的值为:%d\n", c)c ^= 2fmt.Printf("第9行:^= c的值为:%d\n", c)c |= 2fmt.Printf("第10行:|= c的值为:%d\n", c)
}

image-20240326162144099

⑥其它运算符

其它运算符还有用于指针的&(取地址)和*(指针解引用)等。

运算符描述实例
&返回变量存储地址&a; 将给出变量的实际地址。
*指针变量。*a; 是一个指针变量

案例:& 与 *

package mainimport "fmt"func main() {var a int = 4var b int32var c float32var ptr *int//& 返回变量存储地址 例如:&a; 取的是变量的实际地址//* 指针变量 例如:*a; a是一个指针变量/* 运算符实例 */fmt.Printf("1、a的变量类型为 %T \n", a)fmt.Printf("2、b的变量类型为 %T \n", b)fmt.Printf("3、c的变量类型为 %T \n", c)/* & 和 * 运算符实例 */ptr = &a /* 'ptr'接收了变量a的地址*/fmt.Printf("a的值为:%d\n", a)fmt.Printf("ptr的值为 %p\n", ptr)fmt.Printf("*ptr为%d\n", *ptr)
}

image-20240326162256760

3、流程控制

常见的结构主要有三种,顺序、选择、循环结构。如:

package mainfunc main() {//1、顺序结构:从上到下,逐行执行,默认逻辑//2、选择结构:条件满足某些代码才会执行 (满足某些条件)//if//switch//select 后面channel再讲//3、循环结构:条件满足某些代码被反复执行0到n次//for
}

顺序结构,咱们平时写代码、写作等顺序往往就是顺序结构,一个接着一个来,此处不再多讲,重点叙述一下选择结构和循环结构。

①if(选择)

基本的条件分支语句,可以使用elseelse if来扩展。

  • if
if score >= 90 {fmt.Println("A")
} 
  • if … else
if age := 18; age >= 18 {fmt.Println("成年")
} else {fmt.Println("未成年")
}
  • if … else if

案例1:分数评级

package mainimport "fmt"// if 如果 else if 否则如果 else否则
func main() {//var a int = 15////if a > 20 {//	fmt.Println("a>20")//}//if a > 10 {//	fmt.Println("a>10")//}var score intprintln("请输入分数:")fmt.Scanf("%d", &score)//评级 A B C D Eif score >= 90 && score <= 100 {fmt.Println("A")} else if score >= 80 && score < 90 {fmt.Println("B")} else if score >= 78 && score < 80 {fmt.Println("C")} else if score >= 60 && score < 70 {fmt.Println("D")} else {fmt.Println("E")}
}

image-20240326163311622

案例2:if嵌套,登录判断

//创作者:Code_流苏(CSDN)
package mainimport "fmt"func main() {var a, b intvar pwd int = 20221020//用户的输入fmt.Print("请输入密码:")fmt.Scan(&a)//业务:验证密码是否正确if a == pwd {fmt.Print("请再次输入密码:")fmt.Scan(&b)if b == pwd {fmt.Println("登录成功")} else {fmt.Println("登录失败,账户已锁定")}} else {fmt.Println("登录失败,密码错误")}
}

image-20240326163436720

②switch(选择)

用于基于不同的条件执行不同的代码块。Go的switch比其他语言更为灵活,表达式不必为常量或整数。

例如,星期几

dayOfWeek := 3
switch dayOfWeek {
case 1:fmt.Println("星期一")
case 2:fmt.Println("星期二")
default:fmt.Println("其他天")
}

案例1:成绩评级

package mainimport "fmt"func main() {var score intfmt.Scanf("%d", &score)//Switch匹配 caseswitch score {case 90:fmt.Println("A")case 80:fmt.Println("B")case 50, 60, 70:fmt.Println("C")default:fmt.Println("D")}
}

image-20240326163625153

案例2:fallthrough关键字

如果在 case 的代码块中使用了 fallthrough 关键字,即使这个 case 匹配成功,程序也会继续执行下一个 case 的代码块

package mainimport "fmt"// 如果在 case 的代码块中使用了 fallthrough 关键字,
// 即使这个 case 匹配成功,程序也会继续执行下一个 case 的代码块。
func main() {var num int = 1switch num {case 1:fmt.Println("one")fallthroughcase 2:fmt.Println("two")case 3:fmt.Println("three")default:fmt.Println("other number")}
}

image-20240326163912244

③for(循环)

Go语言中唯一的循环结构,可以用来实现传统的for循环、while循环(通过for实现)、无限循环(省略循环条件)。

例如,输出循环次数

for i := 0; i < 5; i++ {fmt.Println("循环次数:", i)
}

案例:计算1到100的和

package mainfunc main() {//for 条件的起始值:循环条件:控制变量自增或者自减//如果是全部省略,for {}的形式,循环将会因为没有条件的限制而一直进行下去sum := 0//计算1到100的和for i := 1; i <= 100; i++ {sum = sum + i}println(sum)
}

image-20240326164018090

案例2:打印5*5方阵

package mainimport "fmt"/*打印一个5×5的*方阵
*****
*****
*****
*****
******/
func main() {for i := 0; i < 5; i++ {for j := 0; j < 5; j++ {fmt.Print("*")}fmt.Print("\n")}
}

image-20240326164201381

案例3:打印9*9乘法表

package mainimport "fmt"// 目标:使用for循环打印99乘法表
func main() {// j 1 2 3for i := 1; i <= 9; i++ {for j := 1; j <= i; j++ {fmt.Printf("%d*%d=%d\t", j, i, i*j)}println()}
}

image-20240326164322295

④break & continue

break用于中断当前循环,continue用于跳过当前循环的剩余代码,直接开始下一次循环迭代。

例如,输出1到5之间的奇数。

for i := 0; i < 10; i++ {if i == 5 {break // 中断循环}if i%2 == 0 {continue // 跳过本次循环迭代}fmt.Println("奇数:", i)
}

案例:break & continue

//创作者:Code_流苏(CSDN)
package mainimport "fmt"func main() {//break 结束当前整个循环for i := 1; i <= 10; i++ {if i == 5 {break}fmt.Println(i)}println("break内容结束")//continue 结束单次循环for i := 1; i <= 10; i++ {if i == 5 {continue}fmt.Println(i)}println("continue内容结束")
}

image-20240326164428307

综上来看,Go语言的简洁性,一部分就体现在它的流程控制语句中:没有dowhile循环,switch比许多其他语言更加强大且灵活。

4、总结

分支结构

  • if

  • if … else if

  • if … else

  • if … else if … else if … else if… else

  • swtich - case

  • swtich - case - fallthrough

  • swtich - case - default

循环

  • for init;end;post {}
  • for { } 死循环
  • break
  • continue
  • for循环的嵌套使用。

很感谢你能看到这里,如有相关疑问,还请下方评论留言。
Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
希望本篇内容能对大家有所帮助,如果大家喜欢的话,请动动手点个赞和关注吧,非常感谢你们的支持!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vulnhub:DR4G0N B4LL: 1

目录 信息收集 1、arp 2、nmap WEB web信息收集 gobuster 隐藏目录发现 图片隐写 ssh登录 提权 get user 系统信息收集 get root 信息收集 1、arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l …

论文篇06-论文范文-论基于架构的软件设计方法ABSD及应用(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

试题 试题:论基于架构的软件设计方法(ABSD)及应用 基于架构的软件设计(Architecture-Based Software Design,ABSD)方法以构成软件架构的商业、质量和功能需求等要素来驱动整个软件开发过程。ABSD是一个自顶向下,递归细化的软件开发方法,它以软件系统功能的分解为基础…

kubernetes-k9s一个基于Linux 终端的集群管理工具

效果预览 下载 github 版本 此文档使用的版本是 v0.32.4&#xff0c;下载地址&#xff1a; https://github.com/derailed/k9s/releases/download/v0.32.4/k9s_linux_amd64.rpm 安装 rpm -ivh k9s_linux_amd64.rpm使用 启动 终端直接执行命令 k9s k9s基本操作 1 选择目…

Spring实例化Bean的三种方式

参考资料&#xff1a; Core Technologies 核心技术 spring实例化bean的三种方式 构造器来实例化bean 静态工厂方法实例化bean 非静态工厂方法实例化bean_spring中有参构造器实例化-CSDN博客 1. 构造函数 1.1. 空参构造函数 下面这样表示调用空参构造函数&#xff0c;使用p…

【JAVA】数据类型与变量(主要学习与c语言不同之处)

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 目标&#xff1a; 1. 字面常量 2. 数据类型 3. 变量 1.字面常量 在上节课 Hello…

C语言操作符详细讲解

前言 本次博客一定会让刚刚学习C语言小白有所收获 本次操作符讲解不仅分类还会有代码示例 好好看 好好学 花上几分钟就可以避免许多坑 1 操作符的基本使用 1.1操作符的分类 按功能分 算术操作符&#xff1a; 、- 、* 、/ 、% 移位操作符: >> << 位操作符…

基于单片机的太阳能充电系统设计

摘要:本文所设计的太阳能充电系统主要由以下几个模块组成:STC89C52 主控模块、TP4056 充电电路、电压AD 采集模块、LCD1602 液晶显示模块和太阳能充电电池等组成。此太阳能充电器制作简单,性价比高,性能稳定。 关键词:LCD1602;太阳能充电系统;ADC0832 太阳能充电系统的充…

QT在子线程中更新UI界面

在Qt中&#xff0c;直接从子线程更新UI是不安全的&#xff0c;因为Qt的UI组件通常不是线程安全的。这意味着&#xff0c;如果你尝试在子线程中直接调用UI组件的方法&#xff0c;可能会导致程序崩溃或者不可预测的行为。为了安全地从子线程更新UI&#xff0c;Qt提供了几种机制&a…

中国电子学会科学技术奖公布,腾讯、北京大学、北京科技大学联合项目获一等奖

3月26日记者获悉&#xff0c;中国电子学会公布科学技术奖获奖名单&#xff0c;由腾讯主导&#xff0c;北京大学、北京科技大学共同参与的联合项目《面向大规模数据的Angel机器学习平台关键技术及应用》获科技进步一等奖。 Angel机器学习平台是支撑腾讯混元大模型的核心技术&am…

c++初步

作业&#xff1a; 定义自己的命名空间&#xff0c;其中有string类型的变量&#xff0c;再定义两个函数&#xff0c;一个函数完成字符串的输入&#xff0c;一个函数完成求字符串长度&#xff0c;再定义一个全局函数完成对该字符串的反转 #include <iostream> #include &…

Linux的学习之路:1、发展史与编译环境的搭建

一、发展史 1991年10月5日&#xff0c;赫尔辛基大学的一名研究生Linus Benedict Torvalds在一个Usenet新闻组 &#xff08;comp.os.minix&#xff09;中宣布他编制出了一种类似UNIX的小操作系统&#xff0c;叫Linux。新的操作系统是受到另一个UNIX的小操作系统——Minix的启发…

蓝桥杯2023真题-幸运数字

目录 进制转换&#xff1a; 思路 代码 题目链接&#xff1a; 0幸运数字 - 蓝桥云课 (lanqiao.cn) 本题就考的进制转换问题&#xff0c;要将十进制5转换成二进制&#xff0c;通过%2,和/2的交替使用即可完成&#xff0c;所得余数就是转换成的二进制各位的值&#xff0c;转换…