尚硅谷Go学习

尚硅谷Go学习

进制:

对于整数,有四种表示方式:

  • 二进制
    • 在golang中,不能直接使用二进制来表示一个整数,她沿用了c的特点
  • 十进制
  • 八进制 以数字0开头
  • 十六进制 以0x或0X开头表示 此处A-F不区分大小写
进制转换
  • 其他进制转十进制

  • 十进制转其他进制

    • 将该数不断除以其他进制的基数,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。

    image-20211106093415401
    image-20211106093415401

  • 二进制转八进制、十六进制

    • 转八进制 三位一组,低位开始组合,转成八进制就可以了。
    • 转十六进制 思维一组,低位开始组合,转成十六进制就可以了。
  • 其他进制转二进制

    • 八进制、十六进制 每三位、四位转成二进制即可
位运算

运算符 &按位与 |按位或 ^按位异或 «左移 »右移

image-20211106094703255
image-20211106094703255

原码、反码、补码
  1. 二进制的最高位是符号位:0表示正数 1表示负数
  2. 正数的原码、反码、补码都一样
  3. 负数的反码=它的原码符号位不变,其他位取反
  4. 负数的补码=负数的反码+1
    • -1 原码[1000 0001] 反码[1111 1110] 补码[1111 1111]
  5. 0的反码补码都是0
  6. 在计算机运算的时候,都是以补码的方式来运算的

image-20211106100410526
image-20211106100410526

函数调用机制

image-20211106101741641
image-20211106101741641

回收栈

image-20211106101856688
image-20211106101856688

说明:

  • 在调用一个函数时,会给该函数分配一个新的空间,编译器会通过自身的处理让这个新的空间和其他的栈的空间区分开来
  • 在每个函数对应的栈中,数据空间是独立的,不会混淆
  • 当一个函数调用完毕(执行完毕)后,程序会销毁这个函数对应的栈空间
func main() {
	n1 := 10
	test(n1)
	fmt.Println("main() ", n1)

	sum := getSum(1,2)
	fmt.Println("main sum = ", sum)
	fmt.Printf("main sum %v\n",&sum)

}
func test(n1 int) {
	n1++
	fmt.Println("test() ", n1)
}
func getSum(n1, n2 int) int {
	sum := n1 + n2
	fmt.Println("get Sum = ",sum)
	//当函数又return语句时,就是将结果返回给调用者
	//即谁调用我,我就返回给谁
	fmt.Printf("get sum %v\n",&sum)
	return sum
}
test()  11
main()  10
get Sum =  3
get sum 0xc00000a0d8
main sum =  3
main sum 0xc00000a0d0

进程 已完成,退出代码为 0
函数的递归调用

image-20211106104718001
image-20211106104718001

顶层栈执行完毕后销毁

image-20211106104802326
image-20211106104802326

image-20211106104837444
image-20211106104837444

image-20211106104910149
image-20211106104910149

总体流程

image-20211106105257021
image-20211106105257021

总结:

  • 执行一个函数时,就会创建一个新的受保护的独立空间(新函数栈)
  • 函数的局部变量是独立的,不会相互影响
  • 递归必须想退出递归的条件逼近,否则就是无限递归了,死龟
  • 当一个函数执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当函数执行完毕或者返回时,该函数本身也会被系统销毁
Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy