Go学习之路(八)数据封装和行为(结构体)

结构体 结构体变量(实例/对象)
结构体是一个自定义变量类型,代表一类事物
结构体变量(实例,对象)是具体的,实际的,代表一个具体变量

在go中通过结构体可以创建多个变量,在这里也可以叫实例,也可以叫对象
结构体关键字 struct
很类似python中的字典
type 类型名 struct{
字段1 数据类型
字段2 数据类型
字段3 数据类型
字段N 数据类型
}
变量名的首字母和字段首字母必须大写,首字母大写表示公开

实例创建及初始化

// 先封装需要的数据类型格式的变量
type Employee struct{
  Id    string
  Name string
  Age int
}
func main(){
  // 第一种创建实例,初始化方法
  e := Employee{"0","zhangsan",20}
  // 第二种创建实例,初始化方式
  e1 := Employee{Name:"lisi",Age:30}
  e1.Id="1"
  // 第三种创建实例,初始化方式
  e2:=new(Employee)  // 注意这里返回的是引用 / 指针 相当于 e := &Employee{}
  e2.Id="3"    // 与其它主要编程语言的差异: 通过实例的指针访问成员不需要使用 ->
  e2.Name="wangwu"
  e2.Age=40 
}

行为(方法)定义

  • 函数是谁都可以调用的
  • 方法就是某个具体的类型才能调用的函数
  • 在Go语言中约定成俗不实用this也不用self,而是使用后面类型的首字母的小写

// 这是第一种定义方式,在实例对应方法被调用时,实例的成员会进行值复制
func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {
函数体
}
// 通常情况下为了避免内存拷贝我们使用第二种定义方式
func (接收者变量 *接收者类型) 方法名(参数列表) (返回参数) {
函数体
}


type people struct{
  Name string
  Gender string
}
// 函数制定接受者之后就是方法
// 方法一
func (p people) dream(){     
  fmt.Printf("查看内存地址:%x\n",unsafe.Pointer(&p.Name))
  fmt.Print("我的梦想是做一条咸鱼!",p.Name)
}
// 方法二
func (p *people) dream(){
  fmt.Printf("查看内存地址:%x\n",unsafe.Pointer(&p.Name))
  fmt.Print("我的梦想是做一条咸鱼!",p.Name)
}
func main(){
  e:=people{
    Name:"张三",
    Gender:"男",
  }
  fmt.Printf("查看内存地址:%x\n",unsafe.Pointer(&e.Name))
  e.dream()
}

运行结果

// 方法一结果
查看内存地址:c000082010
查看内存地址:c000082010
我的梦想是做一条咸鱼! 张三
// 方法二结果
查看内存地址:c000096010
查看内存地址:c000096060
我的梦想是做一条咸鱼! 张三

你可能感兴趣的:(Go学习之路(八)数据封装和行为(结构体))