首页 > 其他 > 详细

Go 结构体

时间:2020-07-02 10:12:40      阅读:48      评论:0      收藏:0      [点我收藏+]

结构体:就是根据基本类型造自己的类型,结构体占用一块连续的内存


定义结构体用大写还是小写?暂时用小写,如果用大写,别的包也能访问

自定义类型

type myInt int //自定义类型。type后面跟类型,用于给基本类型加方法
var n myInt = 100
fmt.Printf("%T", n) // main.myInt

 

// 给自定义类型加方法
// 不能给别的包里的类型添加方法,只能给自己包里的类型添加方法

type myInt int

func (m myInt) hello() {
    fmt.Println("我是一个int")
}

m := myInt(100) // 100默认是int强转为myInt
m.hello()

自定义类型别名

type yourInt = int        //  编译后还是基本类型,只是在代码中给自己看的,例如rune,更直观
var n yourInt = 100
fmt.Printf("%T", n) // int

 

 

结构体模板:

type 类型名 struct {
字段名 字段类型
字段名 字段类型

}
类型名:标识自定义结构体的名称,在同一个包内不能重复。
字段名:表示结构体字段名。结构体中的字段名必须唯一。
字段类型:表示结构体字段的具体类型。没有默认值


值类型结构体

 

type person struct { 
name string
age int
gender string
hobby []string
}


var p person      //这样创建出来的是--p是值类型
p.name = "张三"
p.age = 12
p.gender = "男"
p.hobby = []string{"篮球","双色球"}
fmt.Printf("%T", p)      //main.person

匿名结构体

var user struct{Name string; Age int}       // 匿名结构体,用于临时场景---user是值类型
user.Name = "小王子"
user.Age = 18

指针类型结构体

var p2 = new(person)   //相当于var p2 person; &p2 。p2为结构体的地址
p2.name = "小王子" //可以对结构体指针直接使用"."来访问结构体的成员
p2.age = 28
p2.city = "上海"

 

或者这样创建(常用) 

var p3 = &person{
    name: "小王子"
    age: 28
    city: "上海"
}

 

或者这样创建
p4 := &person{
    "小王子"
    28
    "上海"
}


构造函数: 返回一个结构体变量

问题:构造函数返回结构体?还是结构体指针?
当结构体字段较少可以返回结构体。 当结构体较大要使用指针,较少程序内存开销

func newPerson(name string, age int) *person {
    return &person{
        name: name
        age: age
    }
}

 

"方法"和"接收者"

// dog的结构体
type dog struct {
    name string
}

// 构造函数
func newDog(name string) dog {
     return dog{
         name: name
    }
}

// 这种作用于特定类型的函数才叫做"方法"
// 调用该方法的具体类型的变量叫"接收者",用类型首字母小写表示,比如此处的"d dog"的"d"
func (d dog) wang() {
    fmt.Printf("%s:汪汪汪...", d.name)
}

d1 := newDog("旺财")
d1.wang()


指针"接收者" vs 值"接收者"

func (d dog) wang()... //值"接收者",传的是拷贝
func (d *dog) wang()... //指针"接收者",传的是内存地址

 

什么时候用指针接收者?

  • 要改接收者中的值
  • 接收者是拷贝代价比较大的大对象
  • 保证一致性,如果有某个方法使用了指针接收者,那么其他的方法也应该使用指针接收者。

 

 

 

 

 

 

 

p是指针
fmt.Printf("%T", p) //打印p的类型 *int
fmt.Printf("%p", p) //打印p的值0x3423432

 

Go 结构体

原文:https://www.cnblogs.com/staff/p/13222611.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!