Go基础编程 - 06 - 指针

上一篇:数组与切片

下一篇:map 及其约束


  • Go不能进行偏移或运算,是安全指针。
  • 取址符(&),获取地址;取值符(*),根据地址获取值。

1.1 指针类型、指针地址

Go语言中的值类型(int、float、string、bool、array、struct)都有对应的指针类型;如 *int、*string 等。

获取变量指针地址:&

ptr := &v
其中,v 为变量(类型T);ptr 为用于接收地址的变量(类型为*T),称作 T 的指针类型。

示例:

    var a int = 10
    b := &a
    fmt.Printf("b:%v  Type:%T, b-ptr:%d", b, b, &b)

指针

1.2 指针取值(*)

& 取出地址,* 根据地址取出地址指向的值。

    var a int = 10
    b := &a
    fmt.Printf("%d  %T", *b, *b)

    // 指针传值
    f1 := func(a *int) {
        *a = 100
    }

    f1(&a)
    fmt.Println(a)

小结:

  1. 对变量取地址(&)操作,可以获得这个变量的指针变量。
  2. 指针变量的值是指针地址。
  3. 对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值。

1.3. 空指针

当一个指针被定义后未赋值,它的值为nil。

    var s *string
   
    // 空指针判断
    if s == nil {
        fmt.Println("s is nil")
    }

1.4. 语法糖

使用 & 对结构体进行取址操作,相当于 new()。

	type Student struct {
	    Name string
	    Age  int
	}   
	
	stu := &Student{}
	stu.Name = "小明"
	(*stu).Age = 6
	
	fmt.Printf("%#v\n", stu)

Go语法糖:会适时地为我们进行自动地转译,在stu之上,之所以我们可以通过stu.Name = "小明"设置名字,是因为 Go语言把它自动转译为了(*stu).Name = "小明"

1.5. new()、make()

  1. 二者都是用来做内存分配。
  2. new,(不常用)用于类型的内存分配,并初始化类型零值,返回的是指向类型零值的指针。
  3. make,只用于slice、map以及channel的初始化,返回这三个引用类型本身;
    var s *string                   // 空指针nil,未分配内存(无法取值)
    //fmt.Printf("%p\n", *s)        // invalid memory address or nil pointer dereference

    // new
    s1 := new(string)               // 初始化*string,值为空字符串
    fmt.Printf("%v  %s", s, *s1)

    // makes
    var m map[int]string
    // m[0] = "A"	                // 未初始化分配内存,产生panic: assignment to entry in nil map
    m = make(map[int]string, 10)    // 分配内存,并定义长度
    m[1] = "B"
    fmt.Println(m)

相关推荐

  1. Go基础编程 - 04 - 基本类型、常量和变量

    2024-06-13 23:34:04       30 阅读
  2. Go基础编程 - 07 - 字典(map)及其约束

    2024-06-13 23:34:04       34 阅读
  3. Go自学版】01-基础

    2024-06-13 23:34:04       60 阅读
  4. 突破编程_C++_基础教程(指针(一))

    2024-06-13 23:34:04       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-13 23:34:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-13 23:34:04       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-13 23:34:04       82 阅读
  4. Python语言-面向对象

    2024-06-13 23:34:04       91 阅读

热门阅读

  1. React 事件函数传播及捕获

    2024-06-13 23:34:04       26 阅读
  2. devops自动化运维平台的核心原则有哪些?

    2024-06-13 23:34:04       34 阅读
  3. C++学习步骤

    2024-06-13 23:34:04       51 阅读
  4. hadoop-cos

    2024-06-13 23:34:04       33 阅读
  5. 软件测试--第十一章 设计和维护测试用例

    2024-06-13 23:34:04       34 阅读
  6. CMake“cmake is not able to compile a simple test program”

    2024-06-13 23:34:04       34 阅读