Golang从入门到精通(十五):Golang指针

栏目: C · 发布时间: 5年前

内容简介:一个指针可以指向任何一个值的内存地址 它指向那个值的内存地址,在 32 位机器上占用 4 个字节,在 64 位机器上占用 8 个字节,并且与它所指向的值的大小无关。当然,可以声明指针指向任何类型的值来表明它的原始性或结构性;你可以在指针类型前面加上在Go语言中,直接砍掉了 C 语言指针最复杂的指针运算部分,只留下了获取指针(Go 语言中一个指针被定义后没有分配到任何变量时,它的值为

指针概念

一个指针可以指向任何一个值的内存地址 它指向那个值的内存地址,在 32 位机器上占用 4 个字节,在 64 位机器上占用 8 个字节,并且与它所指向的值的大小无关。当然,可以声明指针指向任何类型的值来表明它的原始性或结构性;你可以在指针类型前面加上 * 号(前缀)来获取指针所指向的内容,这里的 * 号是一个类型更改器。使用一个指针引用一个值被称为间接引用。

Go语言指针

Go 语言中,直接砍掉了 C 语言指针最复杂的指针运算部分,只留下了获取指针( & 运算符)和获取对象( * 运算符)的运算,用法和 C语言 很类似。但不同的是,Go语言中没有 -> 操作符来调用指针所属的成员,而与一般对象一样,都是使用 . 来调用。

Go 语言中一个指针被定义后没有分配到任何变量时,它的值为 nil

Go 语言自带指针隐式解引用 :对于一些复杂类型的指针, 如果要访问成员变量时候需要写成类似 *p.field 的形式时,只需要 p.field 即可访问相应的成员。

new函数

使用 new 函数给一个新的结构体变量分配内存,它返回指向已分配内存的指针:

var t *T = new(T)

这条语句的惯用方法是: t := new(T) ,变量 t 是一个指向 T的指针,此时结构体字段的值是它们所属类型的零值。

注意:

new(structName) :这个方法得到的是 *structName 类型,即类的指针类型;

structName{init para} :这个方法得到的是 structName 类型,即类的实例类型,不是指针。

示例代码如下:

package main

import (
    "fmt"
)

type Student struct {
    name   string
    age    int
    weight float32
    score  []int
}

func main(){
   pp := new(Student)                                  //使用 new 关键字创建一个指针
   *pp = Student{"qishuangming", 23, 65.0, []int{2, 3, 6}}
   fmt.Printf("stu pp have %d subjects\n", len((*pp).score))
   fmt.Printf("stu pp have %d subjects\n", len(pp.score)) //Go语言自带隐式解引用
}

结构体和指针的综合应用

初始化一个结构体实例,除了上面讲的值类型初始化和结构体指针初始化,还有一种更简短和惯用的方式叫字面量初始化(结构体字面量: struct-literal ):

type struct1 struct {
    i1  int
    f1  float32
    str string
}

ms := &struct1{10, 15.5, "Chris"} // 此时ms的类型是 *struct1

混合字面量语法( composite literal syntax&struct1{a, b, c} 是一种简写,底层仍然会调用 new () ,这里值的顺序必须按照字段顺序来写。在下面的例子中能看到可以通过在值的前面放上字段名来初始化字段的方式。所以归根结底,表达式 new(Type) 和 &Type{} 是等价的。

下面的例子显示了一个结构体 Person ,一个方法,方法有一个类型为 *Person 的参数(因此对象本身是可以被改变的),以及三种调用这个方法的不同方式:

package main
import (
    "fmt"
    "strings"
)

type Person struct {
    firstName   string
    lastName    string
}

func upPerson(p *Person) {
    p.firstName = strings.ToUpper(p.firstName)
    p.lastName = strings.ToUpper(p.lastName)
}

func main() {
    // 1-struct as a value type:
    var pers1 Person
    pers1.firstName = "Chris"
    pers1.lastName = "Woodward"
    upPerson(&pers1)
    fmt.Printf("The name of the person is %s %s\n", pers1.firstName, pers1.lastName)

    // 2—struct as a pointer:
    pers2 := new(Person)
    pers2.firstName = "Chris"
    pers2.lastName = "Woodward"
    (*pers2).lastName = "Woodward"  // 这是合法的
    upPerson(pers2)
    fmt.Printf("The name of the person is %s %s\n", pers2.firstName, pers2.lastName)

    // 3—struct as a literal:
    pers3 := &Person{"Chris","Woodward"}
    upPerson(pers3)
    fmt.Printf("The name of the person is %s %s\n", pers3.firstName, pers3.lastName)
}
//output
/*
The name of the person is CHRIS WOODWARD
The name of the person is CHRIS WOODWARD
The name of the person is CHRIS WOODWARD
*/

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

复制互联网之2

复制互联网之2

文飞翔//刘伟 / 清华大学出版社 / 2011-6 / 45.00元

《复制互联网之2:2011年全球最值得模仿的100个网站》从行业的整体发展趋势中,收录了国内外最值得关注的互联网商业模式,为初创网站设计者提供了诸多可供借鉴的最具有启发价值的商业案例。此外,《复制互联网之2:2011年全球最值得模仿的100个网站》对前沿互联网产品的介绍和思考,也值得网站开发人员、产品设计人员及公司管理人员在产品和运营的创新上借鉴与参考。 作者是网易科技频道的编辑,长期致力于......一起来看看 《复制互联网之2》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

html转js在线工具
html转js在线工具

html转js在线工具