结构体`struct`可以用来描述一组数据值,这组值的本质即可以是原始的,也可以是非原始的。是用户自定义的类型,它代表若干字段的集合,可以用于描述一个实体对象,类似`java`,`php`中的`class`,是`golang`面向对象编程的基础类型。
今天我们先来看看`golang`中的成员变量的实现。
>基本的属性(成员变量)
```
type Teacher struct {
Name string
age int
Sex string
}
func Create() Teacher {
cang := Teacher{Name:"teacher cang",age:20,Sex:"woman"}
return cang
}
```
对于在上面结构体`teacher`其实我们可以把它看成一个`class`而`Name`,`Sex`是可以被外部(其他的包)访问的公有变量,而`age`则只能在包内部被访问。
>Method(成员方法)
```
type Student struct {
Name string
Sex string
Age int
}
func (student *Student) SetName(name string) {
student.Name = name
}
func (student *Student) GetName() string {
return student.Name
}
func XiaoPeng() {
xiaoPeng := Student{}
xiaoPeng.SetName("xiao peng")
fmt.Println(xiaoPeng.GetName()) //xiao peng
}
```
`golang`中为`struct`声明成员方法,只需要在`func`指定当前`func`属于的`struct`即可。
上面可以看到我们在指定`struct`的时候,传入的是一个指针。那么可不可以不传指针呢?当然是可以的,但是这个时候我们得到的是一个原结构体的一个副本。
```
type Student struct {
Name string
Sex string
Age int
}
func (student Student) SetAge(number int) {
student.Age = number
fmt.Println(student.Age) //21
}
func (student *Student) GetAge() int {
return student.Age
}
func XiaoPeng() {
xiaoPeng := Student{}
xiaoPeng.SetAge(21)
fmt.Println(xiaoPeng.GetAge()) //0
}
```
可以看到如果在`SetAge`内部是可以访问当前的`age`赋值。但是在外部是获取不到`age`的值的。其实在`SetAge`中是对`xiaoPeng`的一个副本拷贝复制,相当于`值传递`。
##### 期待一起交流
![qrcode_for_gh_60813539dc23_258.jpg](https://static.studygolang.com/191229/a7469c06c43accc3f19ded734b20d55d.jpg)
有疑问加站长微信联系(非本文作者))