nil_test

  1. package main
  2. import (
  3. "fmt"
  4. "unsafe"
  5. )
  6. func main() {
  7. //make和new函数
  8. //new函数用法
  9. //var p *int //声明了一个变量p 但是变量没有初始值就没有内存
  10. //*p = 10
  11. //默认值 int byte rune float bool string 这些类型都有默认值
  12. //指针 切片 map 接口 这些默认值是nil类型 理解为python的none类型
  13. var a int
  14. a = 10
  15. fmt.Println(a)
  16. //对于指针来说或者说其他的默认值是0的情况来说 如何一开始声明的时候就分配内存
  17. var p *int = new(int) //go的编译器就知道先申请一个内存空间 这里的内存中的值全部置为0
  18. *p = 10
  19. //int使用make就不行
  20. //除了 new 函数可以申请内存以外 还有一个函数 make 更加常用, make函数一般用于切片 map
  21. var info = make(map[string]string)
  22. info["c"] = "wozen"
  23. //new函数返回的是这个值的地址 make函数返回的是指定类型的实例
  24. //nil的一些细节
  25. var info2 map[string]string
  26. if info2 == nil {
  27. fmt.Println("map的默认值是 nil")
  28. }
  29. var slice []string
  30. if slice == nil {
  31. fmt.Println("slice的默认值是 nil")
  32. }
  33. var err error
  34. if err == nil {
  35. fmt.Println("error的默认值是 nil")
  36. }
  37. //python中的None 和go 语言中的nil类型不一样, None是全局唯一的
  38. // []string - 24 [string]string info2 - 8
  39. //go语言中的nil是唯一可以用来表示部分类型的零值的标识符 它可以代表许多不同内存布局的值
  40. fmt.Println(unsafe.Sizeof(slice), unsafe.Sizeof(info2))
  41. }

pointer_test

  1. package main
  2. import "fmt"
  3. func swap(a *int, b *int) {
  4. //用于交换a和b
  5. c := *a
  6. *a = *b
  7. *b = c
  8. }
  9. func main() {
  10. //什么是指针 我们提一个问题
  11. a := 10
  12. b := 20
  13. //swap(a, b)
  14. fmt.Println(a, b)
  15. //为什么交换不成功 这个函数运行完成以后 我想要把a 和 b的值变掉
  16. //指针 -对于内存来说 每一个字节其实都是有地址的 - 通过16进制打印出来
  17. fmt.Printf("%p\n", &a) //变量有地址
  18. //现在有一种特殊的变量类型 这个变量只能保存地址值
  19. var ip *int //这个变量里面只能保存地址类型这种值
  20. ip = &a
  21. //如果要修改指针指向的变量的值, 用法也比较特殊
  22. *ip = 30
  23. fmt.Println(a)
  24. //如果定义变量 如何修改指针变量指向的内存中的值 通过指针去取值的时候不知道应该取多大的连续内存空间
  25. fmt.Printf("ip所指向的内存空间地址是: %p, 内存中的值是: %d\n", ip, *ip)
  26. swap(&a, &b)
  27. fmt.Println(a, b)
  28. //还不足以说服大家 但是go中数组是值传递
  29. //数组中有100万个值 对于这种一般我们都采用切片来传递
  30. //在python中list和dict这种传递都是引用传递
  31. //指针还可以指向数组 指向数组的指针 数组是值类型
  32. //arr := [3]int{1, 2, 3}
  33. //var ip_arr *[3]int = &arr
  34. //指针数组
  35. //var ptrs [3]*int //创建能够存放三个指针变量的"数组"
  36. //很多时候都是函数参数指明的类型
  37. //指针的默认值是nil
  38. if ip != nil {
  39. }
  40. //if a != nil {
  41. //
  42. //}
  43. //像python 和 java这种语言都在极力的屏蔽指针
  44. //C/C++ 都提供了指针 指针本身是很强大的
  45. //C/C++中指针的功能很强大 指针的转换/偏移/运算
  46. //go语言没有屏蔽指针,但是go语言在指针上做了大量的限制,安全性高很多,相比较 C/C++ 灵活性就降低了
  47. //go的指针变量中涉及到两个符号 & 和 *
  48. }