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)
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值