Golang的结构体类型struct

作者:matrix 被围观: 1,044 次 发布时间:2023-06-24 分类:Golang | 一条评论 »

这是一个创建于 540 天前的主题,其中的信息可能已经有所发展或是发生改变。

熟悉面向对象语言的话,Golangstruct结构体有点像面向对象编程中的。但这两者不是完全一样,只能说都有继承、封装、多态的特点。

结构体(struct)

结构体可以将零个或多个任意类型的值聚合在一起,能描述多个数据类型

type Person struct {
  name    string
  age     int
  value   string
  address string
}

成员方法和接收者

func (p *Person) setName(name string) {
  p.name = name
}

说明:
setName 为声明的方法
p *Person为接收者(指针类型)

struc类型新增成员方法的语法很另类,像是单独给struct做绑定,绑定的时候会有接收者来指定当前实例类型。

Golang其实可以给任何类型创建成员方法:

type MyInt int
func (i MyInt) IsZero() bool{
  return i == 0
}

这里通过声明int的自定义类型MyInt,然后绑定一个成员方法。灵活~

值接收者 指针接收者

方法的接收者可以是结构体的值或者指针。上面例子的接收者是一个Person类型的指针。指针接收者的一个优点是可以直接修改接收者的字段值,还避免值的拷贝(内部实际上是拷贝的指针)。

声明为值接收者也是可以:

func (p Person) getName() string {
  return p.name
}

getName方法会在调用时复制接收者,就可能会导致性能问题。一般是建议使用指针作为接收者

小结

值接收者或者指针接收者 都能调用结构体或者内嵌结构体的方法或者属性。
给结构体绑定成员方法时,参数最好使用指针,防止值拷贝

func (this *Person) setName(name string) 


// 申明结构体struct
type Person struct {
  name    string
  age     int
  value   string
  address string
}

//结构绑定

// 给结构体绑定成员方法。 不推荐使用,内存利用低效(参数会使用值传递,会内存拷贝)
//p Person这里p表示值接收者
// func (p Person) getName() string {
// 这里的p变量指针和外部调用的mPerson不同,这里属于值拷贝!!!
//  return p.name
// }

// 给Person结构体指针绑定成员方法,同上面效果。但是参数属于引用传递
//this为指针接收者
func (this *Person) getName() string {
  return this.name
}

// 给Person结构体指针绑定方法
func (this *Person) setName(name string) {
  this.name = name
}

func main() {
  //创建实例
  // var mPerson *Person = new(Person)//返回实例指针
  // var mPerson Person = *new(Person)//返回实例
  // var mPerson Person = Person{}//返回实例
  var mPerson *Person = &Person{name: "Hi~"} //获取实例指针
  mPerson.setName("")
  fmt.Println(mPerson.getName())
}

其他文章:
本文固定链接:https://www.hhtjim.com/golang-structure-type-struct.html
matrix
本文章由 matrix 于2023年06月24日发布在Golang分类下,目前没有通告,你可以至底部留下评论。
转载请注明:Golang的结构体类型struct-HHTjim'S 部落格
关键字:,

有1条评论 »

  1. 感谢分享

添加新评论 »

 🙈 😱 😂 😛 😭 😳 😀 😆 👿 😉 😯 😮 😕 😎 😐 😥 😡 😈 💡

插入图片

NOTICE: You should type some Chinese word (like “你好”) in your comment to pass the spam-check, thanks for your patience!