zoukankan      html  css  js  c++  java
  • golang-方法和接口

    1.方法

      方法类似函数 ,多了一个接收者 ,接收者是指针指向结构体(也可以是值) ,方法与结构体绑定 (可以理解为模板定义方法) ,方法位于结构体内部

      方法集可以理解就是多个方法

      可以组合其他结构体方法 ,直接将其他结构体类型放入属性

    2.创建方法

      接收者指定好对应的结构体 ,可以直接引用结构体内的所有属性和方法

     1 package main
     2 
     3 import "fmt"
     4 
     5 type Ven struct {
     6     Name    string
     7     address string
     8 }
     9 
    10 func (v *Ven) Name_info() string {
    11     return "公司名称" + v.Name
    12 }
    13 
    14 func (v *Ven) Address_info() string {
    15     return fmt.Sprintf(",公司地址%v", v.address)
    16 }
    17 
    18 func (v *Ven) Info() string {
    19     return v.Name_info() + v.Address_info()
    20 }
    21 
    22 func main() {
    23     a1 := Ven{
    24         Name:    "亚马逊",
    25         address: "美国",
    26     }
    27 
    28     fmt.Println(a1.Info())
    29 }
    View Code

    3.使用方法与指针

      希望方法修改实例内部 ,方法定义指针接收者 

      希望方法不修改实例 ,方法定义值接收者

     1 package main
     2 
     3 import "fmt"
     4 
     5 type Ven struct {
     6     Name    string
     7     address string
     8     remarks string
     9 }
    10 
    11 func (v *Ven) Name_info() string {
    12     return "公司名称" + v.Name
    13 }
    14 
    15 func (v *Ven) Edit_remarks(in string) {
    16      v.remarks = in
    17 }
    18 
    19 func (v Ven) Edit_remarks1(in string) {        //值引用无法做用实例
    20     v.remarks = in
    21 }
    22 
    23 func main() {
    24     a1 := Ven{
    25         Name:    "亚马逊",
    26         address: "美国",
    27     }
    28 
    29     fmt.Println("备注",a1.remarks)
    30     a1.Edit_remarks("亚马逊商城退出中国")
    31     fmt.Println("备注",a1.remarks)
    32     a1.Edit_remarks1("亚马逊进入中国")   //值引用无法做用到a1实例
    33     fmt.Println("备注",a1.remarks)
    34 
    35 }
    View Code

    4.接口

      接口指定了方法集中所有方法的规范 ,但不实现

      接口指定方法的函数签名部分

      接口可以实现代码重用和完全替换实现

     1 package main
     2 
     3 import "fmt"
     4 
     5 type DB_inter interface {
     6     Read() string
     7     Write() string
     8 }
     9 
    10 type RW struct {
    11 }
    12 
    13 func (r *RW) Read() string {
    14     return "读取数据"
    15 }
    16 
    17 func (r *RW) Write() string {
    18     return "写入数据"
    19 }
    20 
    21 type Mysql struct {
    22     Name string
    23     RW   //继承方法 ,实现了接口
    24 }
    25 
    26 type Postgre struct {
    27     Name string
    28     RW   //继承方法 ,实现了接口
    29 }
    30 
    31 //接口函数
    32 func R(obj DB_inter) string {
    33     return obj.Read()
    34 }
    35 
    36 func W(obj DB_inter) string {
    37     return obj.Write()
    38 }
    39 
    40 func main() {
    41     mysql := Mysql{Name: "mysql数据库"}
    42     pg := Postgre{Name: "pg数据库"}
    43 
    44     fmt.Println(R(&mysql))        //此处必须使用指针
    45     fmt.Println(R(&pg))            //此处必须使用指针
    46 
    47 }
    View Code

     

  • 相关阅读:
    PHP实现无限极分类
    html2canvas生成并下载图片
    一次线上问题引发的过程回顾和思考,以更换两台服务器结束
    Intellij IDEA启动项目报Command line is too long. Shorten command line for XXXApplication or also for
    mq 消费消息 与发送消息传参问题
    idea 创建不了 java 文件
    Java switch 中如何使用枚举?
    Collections排序
    在idea 设置 git 的用户名
    mongodb添加字段和创建自增主键
  • 原文地址:https://www.cnblogs.com/quguanwen/p/11754495.html
Copyright © 2011-2022 走看看