自己也可以免费轻松创建一个网站,常州网站建设方案外包,自建社区网站,沈阳最新新闻事件今天指针#xff0c;以及标识符 
1.指针 
#xff08;1#xff09;.基本介绍 
1#xff09;基本数据类型#xff0c;变量存的值#xff0c;也叫值类型 
2#xff09;获取变量的地址用#xff0c;比如 var num int ,获取num的地址#xff1a;num 
3)指针类型以及标识符 
1.指针 
1.基本介绍 
1基本数据类型变量存的值也叫值类型 
2获取变量的地址用比如 var num int ,获取num的地址num 
3)指针类型变量存的是一个地址这个地址指向的空间存的才是真正值比如 var ptr *int num 
4)获取指针类型所指的值使用*,比如var *ptr int,使用 *ptr获取p指向的值 
5举例说明 
package mainimport(fmt
)
//演示golang中的指针类型
func main(){//基本数据在内存的布局var i int  10 // i的地址是多少 ifmt.Println(i的地址,i)  //结果为i的地址 0xc04205e058//1.a是一个指针变量//2. a的类型是 *int//3.a 本身就是 ivar a *int ifmt.Println(i的值是,i) //10fmt.Println(a存放的值是,a)//0xc04205e058fmt.Println(a指向的值是,*a)//10fmt.Println(指针本身的地址是,a)//0xc04207c020或者可以使用printf()进行格式化输出}内存布局图 关于指针的内存布局操作 练习通过指针修改所存变量地址中存放的值 
package mainimport(fmt
)func main(){
var a int 999
fmt.Println(a的地址是,a)
fmt.Println(指针修改之前a的值是,a)
var prt *int  a
fmt.Println(prt的值是,*prt)
*prt  23  //通过指针去修改a变量的值
fmt.Println(prt的值是,*prt)
fmt.Println(通过指针修改后这个a的值是,a)}判断对错 
func main(){
var a int  300
var ptr *int a //错误应该是 a
}func main(){
var a int  300
var prt *float32  a //错误类型不一致不应该是float
}func main(){
var a int 300
var b int 400var ptr *int a
*ptr  100 //a100
ptr  b  //存放b的地址
*ptr  200  //b200
fmt.Printf(a%d, b%d,*ptr%d,a,b,*ptr)}2指针的细节说明 
1)值类型都有对应的指针类型形式为“数据类型”比如int 的对应的指针就是 * int,而float32对应的指针类型就是 *float32 ,以此类推 
2)值类型基本数据类型int系列float系列bool string \数组和结构体struct 
2.值类型和引用类型 
1说明 
1)值类型:基本数据类型int系列float系列bootl,string、数组和结构体struct 
2)引用类型指针slice切片、map、管道chan,interface等都是引用类型 
2值类型和引用类型的区别 
1值类型变量直接存储内存通常在栈中分配 2引用类型变量存储的是一个地址这个地址对应的空间才真正存储数据值内存通常在堆中分配当没有任何变量引用这个地址时该地址对应的数据空间就成为一个垃圾由GC来回收 3.标识符的命名规范 
1.标识符概念 
1golang对各种变量、方法等命名时使用的字符序列称为标识符 
2凡是自己可以起名字的地方都叫标识符 
2.标识符的命名规则(6点) 
1由26个英文字母大小写0~9下划线—组成 
2数字不可以开头 
3Golang中严格区分大小写 
4标识符不能包含空格 
5下划线—本身在go中是一个特殊字符称为空标识符可以代表任何其他的标识符但是它对应的值会忽略比如忽略某个返回值所以仅能被作为占位符使用不能作为标识符使用 
6不能以系统保留关键字作为标识符比如break、if等等… 
package mainimport fmt//演示golang中标识符的使用
func main() {//严格区分大小写var num int  10var Num int  20fmt.Printf(num%v,Num%v,num,Num) //10 20//标识符中不能含有空格
//    var ab c int  30  //会报错//_是空标识符用于占用
// var _ int 40  // erro} 3go中的保留字 
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cm24KPYQ-1693040914579)(D:\myfile\后端\go语言学习\pic\关键字.jpg)] 
标识符的案例 
hello  //OK
hello12 //OK
1hello //erro 不能以数字开头
h-b  //erro 不能使用-
x h   //erro 不能有空格
h_4   //ok
_ab   //ok
int    //ok 不推荐甚至不要去用,语法通过不推荐使用
var int int 10
fmt.Println(int的值,int)//10success
float32  //ok
_  //erro
Abc  //ok 
4标识符命名注意事项 
1包名保持package的名字和目录保持一致尽量采取有意义的包名简短有意义不要和标准库冲突 
2变量名、函数名、常量名采用驼峰法 
var stuName string Tom
var goodPrice int32 124//第一个单词字母小写往后的单词采用大写的形式3如果使用变量名、函数名、常量名首字母大写则可以被其他的包访问如果首字母小写则只能在本包中使用可以简单理解成首字母大写是公有的首字母小写是私有的 预定标识符 保留关键字的介绍 5运算符 
运算符是一种特殊的符号用以表示数据的运算赋值和比较等 
1算术运算符 
主要是对数值型的变量进行运算比如加减乘除在Go程序中使用最多 package mainimport(fmt
)func main() {
//重点讲解 /,%
//如果参与运算的数都是整数那么除后去掉小数部分保留整数部分。不会四舍五入
fmt.Println(10/4) //是2不是2.5
var n1 float32  10 /4  //?结果也是2
fmt.Println(n1)//如果我们需要保留小数部分则需要有浮点数参与运算
var n2 float32  10.0 /4
fmt.Println(n2) //2.5
}
//演示%的用法
//演示 % 的使用
//看一个公式 a%ba - (a/b) *b
fmt.Println(10%3,10 % 3) //结果余数是1
fmt.Println(-10%3,-10 % 3) //结果余数是-1 : -10 - [(-10)/3]*3 -10 -(-9)-1
fmt.Println(10%-3,10 % -3) //结果余数是 1
fmt.Println(-10%-3,-10 % -3) //结果余数是 -1
//演示  --
var i int  10
i  //等价 i  i1
fmt. Println(i的值是,i)  //11
i-- //等价i  i -1
fmt. Println(i的值是,i)  //106细节说明 
1对于除号 ”/“他的整数和小数除是有区别的整数之间做除法时只保留整数部分而舍弃小数部分例如 x : 19/5 结果是3 
2当对一个数取模式时可以等价 a%b a- a/b *b,这样我们就可以看到取模的本质运算 
3Golang的自增自减只能作为一个独立语言时不能这样使用 b :a或者b :a– 
4Golang的和–只能写在变量的后面不能写在变量的前面既a a–没有a 或者–a 
5Golang的设计者去掉c/java中的自增自减的容易混淆的写法让Golang的语法更加简洁统一 练习 
1假如还有97天放假 问 xx个星期零xx天 
2定义一个变量保存华氏温度华氏温度转换为摄氏温度的公式是5/9*(华氏温度-100)求出华氏温度对应的摄氏温度 
package mainimport (fmt
)func main(){//题1var day int  97var week int  day/7var mo int  day%7
fmt.Printf(还有%d天放假,是%d个星期%d天,day,week,mo)var huashi float32  134.2
var sheshi float32  5.0 / 9 * (huashi - 100)
fmt.Printf(%v对应的摄氏温度%v,huashi,sheshi) 19 
}2赋值运算符 
介绍 
赋值运算符就是将某个运算后的值赋给指定的变量 
赋值运算符的分类 案例演示 
1赋值基本案例 
2有两个变量a和b 要求将其交换最终打印结果 
3的使用案例 
package mainimport (fmt)func main() {//赋值运算符的使用演示// var i int // i  10   //基本赋值//有两个变量a和b要求将其进行交换最终打印结果//a 9 b2 a 2 b 9a : 9b : 2//定义一个临时变量t :aa bb tfmt.Printf(交换后的情况如下 a%v,b%v,a,b)//复和赋值的操作a 7  //等价 a  a7fmt.Println(a7的值为,a)}赋值运算符的特点 
1运算顺序从右往左 
2赋值运算符的左边只能是变量 右边 可以是变量、表达式、常量值 
3复合运算符等价于下面的效果 
a3 aa3 
3比较运算符/关系运算符 
(1)关系运算符的结果都是bool型也就是要么为true,要么为false 
(2)关系表达式经常用字在if结构中或者循环条件中 
关系运算符一览表 细节说明 
关系运算符的结果都是bool型也就是要么为true,要么为false关系运算符组成的表达式我们称为关系表达式 ab比较运算符”“不能写成 “” 
面试题 
package mainimport(fmt
)
func main(){//有两个变量a和b要求将其进行交换但是不允许使用中间变量最终打印效果var a int  10var b int  20a  a  b  //30 b  a - b  // 10a  a -b  //30-10 20fmt.Printf(a%v和b%v,a,b) //20 和 10
}4逻辑运算符 
介绍 
用于连接多个条件一般来讲就是关系表达式最终的结果也是一个bool值 
逻辑运算一览表 案例演示 
package main
import (fmt
)func main() {//演示如何使用逻辑运算符var age int 40if  age  30  age  50{fmt.Println(ok1)}if  age  30  age  40{fmt.Println(ok2)}//演示逻辑或的使用  ||if  age  30 || age  50{fmt.Println(ok3)}if  age  30 || age  40{fmt.Println(ok4)}//演示逻辑非的使用 !if  !(age  30) {fmt.Println(ok5) //不输出}
}注意事项和使用细节 
也叫短路与如果第一个条件为false则第二个条件不会判断最终结果为false||也叫短路或如果第一个条件为true则第二个条件不会判断最终结果为true 
案例演示 
//声明一个测试函数(测试)
func test() bool {fmt.Println(test....)
return true
}func main() {var i  int  10//短路与的//说明i9 这个为false 第二条件根本不会去判断不会调用test函数if i  9  test(){fmt.Println(ok)}//短路或//说明i9 这个为true 第二条件根本不会去判断不会调用test函数if i  9 || test(){fmt.Println(ok)} 
运算符的优先级 
1运算符有着不同的优先级所谓优先级就是表达式运算中的运算顺序如下表上一行运算符总优先于下一行 2只有单目运算符、赋值运算符是从右往左运算的 
3大致的顺序整理 
括号.–单目运算算术运算符移位运算关系运算位运算逻辑运算符赋值运算符逗号 
6其他运算符 
位运算符 课堂练习 
1两个数的最大值 
2求三个数的最大值 
func main() {//求两个数的最大值var n1 int 10var n2 int 40var max intif n1  n2{max n1}else{max n2}fmt.Println(两个数的最大值为,max)//求出三个数的最大值//先求出两个数的最大值然后让第三个数取比较var n3 int 45if n3  max {max n3}fmt.Println(三个数中的最大值是,max)
}键盘输入语句 
介绍 
在编程中需要接收用户输入的数据就可以使用键盘输入语句来获取’ 
步骤 
1导入fmt包 
2调用fmt包的fmt.Scanln()或者fmt.Scanf() 
案例演示 
要求可以从控制台上接受用户信息。[姓名年龄薪水,是否通过考试] 
1使用fmt.Scanln()获取 
fmt.Println(请输入姓名)//当程序执行到fmt.Scanln(name)是程序会停止运行并等待用户的输入fmt.Scanln(name)fmt.Println(请输入年龄)fmt.Scanln(age)fmt.Println(请输入薪水)fmt.Scanln(sal)fmt.Println(是否通过考试)fmt.Scanln(isPass)fmt.Printf(名字是%v \n 年龄是%v \n 薪水是 %v \n 是否通过考试 %v ,name,age,sal,isPass)2使用fmt.Scanf()获取 
/方式2.一次性输入这些信息 fmt.Scanf()可以按指定的格式输入信息
fmt.Println(姓名年龄薪水是否通过考试,输入时采用空格隔开)
fmt.Scanf(%s %d %f %t ,name,age,sal,isPass)
fmt.Printf(名字是%v \n 年龄是%v \n 薪水是 %v \n 是否通过考试 %v ,name,age,sal,isPass)4.go语言机制转换 
1进制介绍 二进制 : 0,1 满2进1在golang中不能直接使用二进制表示一个整数因为他沿袭了C语言的风格要输出就%b  十进制:0~9满10进1  八进制:0~7满8进1以数字0开头表示  十六进制0~9A-F满16进1以0x或0x开头表示 此处A~F不区分大小写 如0x21AF102x21B0  
2)案例使用 
func main(){var i int 5;fmt.Printf(%d的二进制是%b\n,i,i) //输出的结果是5的二进制是101//八进制0~7满8进1以数字0开头进行表示var j int  011fmt.Println(j,j) //9//0~9及A-F以0x或0X表示var k int  0x11fmt.Println(k,k) //17}进制转换的介绍 
第一组其他进制转换为十进制 1二进制转十进制 
规则从最低位开始右边的将每个位上的数提取出来乘以2的位数-1次方然后求和 
案例请将二进制1011转成十进制的数
10111*11*20*2*21*2*2*2120811 
2八进制转十进制 
规则从最低位开始右边的将每个位上的数提取出来乘以8的位数-1次方然后求和 
请将0123转成十进制的数
32*81*8*8833十六进制转十进制 
规则从最低位开始右边的将每个位上的数提取出来乘以8的位数-1次方然后求和 
请将0x34A转成十进制的数
104*163*16*16842 
第二组十进制转其他进制 
1十进制转二进制 
规则将该数不断除于2直到商为0为止然后将得到的余数倒过来就是对应的二进制 
案例请将56转成2进制 2十进制转八进制 
规则将该数不断除于8直到商为0为止然后将得到的余数倒过来就是对应的二进制 
3十进制转十六进制 
规则将该数不断除于16直到商为0为止然后将得到的余数倒过来就是对应的二进制 
第三组 
1二进制转八进制 
规则将二进制数每三位一组从低位开始组合转成对应的八进制数即可 
案例将二进制 11010101转成八进制 
110101010325 
2二进制转十六进制 
规则将二进制每四位数一组从低位开始组合转换对应的十六进制数即可 
案例请将二进制11010101转成16进制数为0XD5 
11100101 转化为八进制0345 
1110010110转化为十六进制0x396 
第四组 
1将八进制数每1位转成对应的一个3位的二进制数即可 
案例请将0237转成二进制 
023710011111 
2)将十六进制每1位转成1个4位的二进制数 
0x3D0x111101 
原码 补码反码 golang有三个位运算 2的补码00000010 
3的补码 00000011 
2300000010 2 
2|3000000113 
2^300000001 
-2^2-4 
-2的原码为10000010 
-2的反码为11111101 
-2的补码11111110 
2的补码 00000010 
故-2^211111100 的原码是先求出他的反码然后进行取反操作 
反码补码-111111011》原码符号位不变其他取反10000100-4 
-110000001》反码》11111110补码11111111 00000001全是0 
func main(){//位运算的知识演示fmt.Println(23) //2fmt.Println(2|3)//3fmt.Println(2^3)//1//下面是带有负数的二进制fmt.Println(-2^2)//-4}golang有两个移位运算符 右移、 左移
右移运算符 :低位溢出符号位不并用符号位补溢出的高位
左移运算符 符号位不变低位补0案例演示 
都要将原来的数变成补码进行运算
a:12//00000001000000000 右移即补码左边补0
c:12 //00000001000001004左移即补码右边补0
fmt.Println(12)//0
fmt.Println(12)//4 
…(img-EvonRpVt-1693040914591)] 
2的补码00000010 
3的补码 00000011 
2300000010 2 
2|3000000113 
2^300000001 
-2^2-4 
-2的原码为10000010 
-2的反码为11111101 
-2的补码11111110 
2的补码 00000010 
故-2^211111100 的原码是先求出他的反码然后进行取反操作 
反码补码-111111011》原码符号位不变其他取反10000100-4 
-110000001》反码》11111110补码11111111 00000001全是0 
func main(){//位运算的知识演示fmt.Println(23) //2fmt.Println(2|3)//3fmt.Println(2^3)//1//下面是带有负数的二进制fmt.Println(-2^2)//-4}