go语言基础-结构体方法

Goland语言面向对象编程说明

1、Goland 也支持面向对象编程,但是和传统的面向对象编程有区别 并不是纯粹的面向对象语言。
2、goland 没有类概念,go 语言的结构体和其他编程语言的类有同等地位 可以理解goland 是基于struct 来实现OOP特性的。
3,goland 面向对象编程非常简洁,去掉了传统OOP 语言的继承、方法重载、构造函数、析构函数以及隐藏的this指针等。
4、 golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OOP语言不一样,比如继承:golang没有extends关键字,继承是通过匿名字段来实现。
5、 golang面向对象很优雅,OOP本身就是语言类型系统的一部分,通过接口关联,耦合性低,也非常灵活。

以下是关于结构体以及结构体类型的方法的测试
package main
import "fmt"
/*********************************************************************
   作用于特定类型的函数(即类型方法),特定类型变量称为接收者
    定义语法:
    func (接收者变量 接收者类型) 方法名(参数列表) (返回参数列表) {}
    建议:
    1. 接收者变量:接收者的参数变量名在命名时,官方建议使用接收者类型名的第一个小写字母
    2. 接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型
    3. 方法名、参数列表、返回参数: 其具体格式与函数定义相同
    区别于平时的函数:
      函数不属于任何类型,特定类型的函数(方法)属于特定类型
***********************************************************************/
/***********************************************************************
 这里重点介绍特定结构体的方法
  • 方法的定义:方法实际上也是函数,只是在声明时,在关键字 func 和方法名之间增加了一个参数
    • 普通的函数定义 func 方法名(入参) 返回值
    • 自定义类型的方法定义 func (接收者) 方法名 (入参)  返回值
  • 方法分为值传递和指针传递
    • func (u user) notify()  //值传递方式即copy一份user
    • func (u *user) notify() //传递指针(即地址),内部改变会影响原结构体
   什么时候使用指针接受者
  1.需要修改接收者中的值
  2.接收者是拷贝代价比较大的大对象
  3.保证一致性,如果有某个方法使用了指针接收者,那么其他的方法也应该使用指针接收者 
*************************************************************************/
//结构体类型或对象
type rect struct {
    width, 
height int
}
//方法的指针传递,r成为接受者变量,*rect成为接受者类型
func (r
*rect) product() int { return r.width * r.height }
//方法的值传递 func (r rect) add()
int { return 2*r.width + 2*r.height }
//小结:
// 当前rect就具有了两个方法 product和add
// 可以给任何类型定义方法,扩展方法。 // 非本地类型不能定义方法,也就是说我们不能给别的包的类型定义方法 func main() { //方法一:初始化结构体以及其成员
r :
= rect{width: 10, height: 5} fmt.Println("area:", r.product()) fmt.Println("area:", r.add()) rs := &r fmt.Println("area:", rs.product()) fmt.Println("area:", rs.add())
//方法二:初始化的赋值的另外一种方法
var r1 rect
rect.width=10
rect.hight=14
fmt.Println(rect)

      //方法三: 初始化的赋值的另外一种方法

      r2 := rect{2, 16} 
      fmt.Println(r2)

}

 

posted @ 2022-05-28 16:25  jinzi  阅读(1)  评论(0编辑  收藏  举报