Golang 入门(2)

值类型和引用类型

基本概念

值类型:变量直接存储值,内存通常在栈中分配

引用类型:变量存储的是一个地址,这个地址对应的空间才是真正的存储数据,内存通常在堆上分配,当没有任何变量引用这个地址时,改地址对应的数据空间就成为了一个垃圾,由GC来回收。

常见的值类型和引用类型

值类型: 基本数据类型的int系列,float系类,bool,string。数组和结构体struct

引用类型: 指针, slice切片, map, 管道chan ,interface等都是引用类型

指针

基本介绍

  1. 对于基本数据类型,变量存的就是值,也就是值类型
    image-20250930134926520
  2. 获取变量的地址用的是&
  3. 指针类型,变量存的是一个地址,这个地址指向的空间才是值
     var i int = 10
  var ptr *int = &i

(1)ptr 是一个指针变量

(2)ptr 的类型是*int

(3)ptr 本身的值是&i

ptr中存储的是i的地址,同时ptr他也有自己的一个地址,

image-20250930140202931
  1. 获取指针类型所指向的值,使用*

我们如果要通过ptr存储的地址进而获取到这个地址上存储的数据,即i的值我们需要用*,来获取

image-20250930140447022

小练习:

打印出变量num的地址,并用ptr存储地址,再通过ptr去修改num的值

 func main() {
  var num int
  fmt.Println(&num)
  var ptr *int = &num
  fmt.Println(ptr)
  *ptr = 100
  fmt.Println(*ptr)
 }

标识符

命名规则

  1. 由26个英文字母大小写,0-9,_组成
  2. 数字不可以开头
  3. 严格区分大小写
  4. 标识符不能有空格
  5. 下划线被称为空标识符,可以代表任何其他标识符,但是他对应的值会被忽略,所以只能作为占位符,不能作为标识符
  6. 不能以系统保留关键字作为标识符

注意事项

  1. 包名:要保持package的名字和目录保持一致,尽可能采取有意义的命名
  2. 函数变量常量命名采用驼峰法
  3. 如果变量名,函数名,常量名首字符大写可以被其他包访问,如果首字符小写,只能在本包内使用。

运算符

假定 A 值为 10,B 值为 20

算术运算符

运算符描述实例
+相加A + B 输出结果 30
相减A – B 输出结果 -10
*相乘A * B 输出结果 200
/相除B / A 输出结果 2
%求余B % A 输出结果 0
++自增A++ 输出结果 11
自减A– 输出结果 9

注意:自增自减不能写为b := a++,Golang中没有++a,只有a++

小案例:

有两个变量,a和b,要求对其进行交换,但是不想允许使用中间变量,最后打印结果

 func main() {
  var a int = 10
  var b int = 20
  a = a + b
  b = a - b
  a = a - b
  fmt.Println(a, b)
 }

关系运算符

运算符描述实例
==检查两个值是否相等,如果相等返回 True 否则返回 False。(A == B) 为 False
!=检查两个值是否不相等,如果不相等返回 True 否则返回 False。(A != B) 为 True
>检查左边值是否大于右边值,如果是返回 True 否则返回 False。(A > B) 为 False
<检查左边值是否小于右边值,如果是返回 True 否则返回 False。(A < B) 为 True
>=检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。(A >= B) 为 False
<=检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。(A <= B) 为 True

逻辑运算符]()

运算符描述实例
&&逻辑 AND 运算符。 如果两边的操作数都是 True,则条件 True,否则为 False。(A && B) 为 False
||逻辑 OR 运算符。 如果两边的操作数有一个 True,则条件 True,否则为 False。(A || B) 为 True
!逻辑 NOT 运算符。 如果条件为 True,则逻辑 NOT 条件 False,否则为 True。!(A && B) 为 True

位运算符

运算符描述实例
&按位与运算符”&”是双目运算符。 其功能是参与运算的两数各对应的二进位相与。(A & B) 结果为 12, 二进制为 0000 1100
|按位或运算符”|”是双目运算符。 其功能是参与运算的两数各对应的二进位相或(A | B) 结果为 61, 二进制为 0011 1101
^按位异或运算符”^”是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。(A ^ B) 结果为 49, 二进制为 0011 0001
<<左移运算符”<<“是双目运算符。左移n位就是乘以2的n次方。 其功能把”<<“左边的运算数的各二进位全部左移若干位,由”<<“右边的数指定移动的位数,高位丢弃,低位补0。A << 2 结果为 240 ,二进制为 1111 0000
>>右移运算符”>>”是双目运算符。右移n位就是除以2的n次方。 其功能是把”>>”左边的运算数的各二进位全部右移若干位,”>>”右边的数指定移动的位数。A >> 2 结果为 15 ,二进制为 0000 1111

赋值运算符

运算符描述实例
=简单的赋值运算符,将一个表达式的值赋给一个左值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

注意:Golang中没有三元运算符

获取用户输入

这里直接上案例了

要求:从控制台获取用户信息,信息包括,姓名,年龄,薪资,是否通过面试

1.使用fmt.Scanln()获取 

func main() {
  var name string
  var age byte
  var sal float32
  var isPass bool
  fmt.Println("请输入姓名")
  fmt.Scanln(&name)
  fmt.Println("请输入年龄")
  fmt.Scanln(&age)
  fmt.Println("请输入薪资")
  fmt.Scanln(&sal)
  fmt.Println("请输入是否通过面试")
  fmt.Scanln(&isPass)
 }

2.使用fmt.Scanf()获取

 func main() {
  var name string
  var age byte
  var sal float32
  var isPass bool
  fmt.Println("请输入你的姓名,年龄,薪水,是否通过面试,使用空格隔开")
  fmt.Scanf("%s %d %f %t", &name, &age, &sal, &isPass)
 }

原码、反码、补码

六句话:

对于有符号的而言

  1. 二进制最高位为符号位,0为正数,1为负数
  2. 正数的原码反码补码都一样
  3. 负数的反码=原码符号位不变,其他位取反
  4. 费用是关于的补码等于反码+1
  5. 0的反码补码都是0
  6. 在计算机运算的时候都是以补码的方式来运算的
暂无评论

发送评论 编辑评论


				
上一篇
下一篇