浅谈Go语言中的结构体struct & 接口Interface & 反射

本文详细探讨Go语言中的结构体struct、接口Interface和反射机制。介绍了struct的定义、使用、内存布局、匿名字段及继承,接口的定义、实现、多态性和嵌套,以及反射的常用操作,包括类型断言和结构体字段的访问与修改。通过实例展示了Go语言在这些领域的特性与应用。
摘要由CSDN通过智能技术生成

浅谈Go语言中的结构体struct & 接口Interface & 反射

 

结构体struct

struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套;

go中的struct类型理解为类,可以定义方法,和函数定义有些许区别;

struct类型是值类型。

struct定义

?

1

2

3

4

5

type User struct {

 Name string

 Age int32

 mess string

}

?

1

2

3

var user User

var user1 *User = &User{}

var user2 *User = new(User)

struct使用

下面示例中user1和user2为指针类型,访问的时候编译器会自动把 user1.Name 转为 (*user1).Name

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

func main() {

 var user User

 user.Name = "nick"

 user.Age = 18

 user.mess = "lover"

 

 var user1 *User = &User{

  Name: "dawn",

  Age: 21,

 }

 fmt.Println(*user1)     //{dawn 21 }

 fmt.Println(user1.Name, (*user1).Name) //dawn dawn

 

 var user2 *User = new(User)

 user2.Name = "suoning"

 user2.Age = 18

 fmt.Println(user2)      //&{suoning 18 }

 fmt.Println(user2.Name, (*user2).Name) //suoning suoning

}

构造函数

golang中的struct没有构造函数,可以伪造一个

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

type User struct {

 Name string

 Age int32

 mess string

}

 

func NewUser(name string, age int32, mess string) *User {

 return &User{Name:name,Age:age,mess:mess}

}

 

func main() {

 //user := new(User)

 user := NewUser("suoning", 18, "lover")

 fmt.Println(user, user.mess, user.Name, user.Age)

}

内存布局

struct中的所有字段在内存是连续的

?

1

2

3

4

5

6

7

8

9

var user User

 user.Name = "nick"

 user.Age = 18

 user.mess = "lover"

 

 fmt.Println(user)     //{nick 18 lover}

 fmt.Printf("Name:%p\n", &user.Name) //Name:0xc420016180

 fmt.Printf("Age: %p\n", &user.Age) //Age: 0xc420016190

 fmt.Printf("mess:%p\n", &user.mess) //mess:0xc420016198 8字节为内存对齐

方法

方法是作用在特定类型的变量上,因此自定义类型,都可以有方法,而不仅仅是struct。

方法的访问控制也是通过大小写控制。

init函数是通过传入指针实现,这样改变struct字段值,因为是值类型。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

type User struct {

 Name string

 Age int

 sex string

}

 

func (this *User) init(name string, age int, sex string) {

 this.Name = name

 this.Age = age

 this.sex = sex

}

 

func (this User) GetName() string {

 return this.Name

}

 

func main() {

 var user User

 user.init("nick", 18, "man")

 //(&user).init("nick", 18, "man")

 name := user.GetName()

 fmt.Println(name)

}

匿名字段

如果有冲突的, 则最外的优先

?

1

2

3

4

5

6

7

8

9

10

11

type User struct {

 Name stirng

 Age int 

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值