zoukankan      html  css  js  c++  java
  • Go语言学习之方法和接口

    方法

    Golang中函数指的是一个封装的代码块,我们可以直接调用它,并返回结果;

    而方法其实也是一种函数,只不过方法需要和某个对象绑定;

    方法的定义

    /* 定义结构体 */
    type struct_name struct {
       /* variables */
    }
    
    /* 定义方法 */
    func (struct_name_variable struct_name) method_name() [return_type] {
       /* 方法实现 */
    }
    
    /* 实例化结构体 */
    test := struct_name
    /* 通过结构体调用方法 */
    test.method_name

    方法接收者

    方法接收者 是一个特殊参数,给函数指定了这个参数之后,函数就成了方法了

    例如下面这样,定义了一个 汽车结构,然后定义了一个 接收者方法, 然后就可以用面向对象的方式来调用这个方法了.

    //定义一个结构体
    type MyCar struct{
        id int
    }
    
    //定义一个方法,beep为方法的名称,Car就是结构体,意思就是和Car这个结构体绑定,c就是方法内部调用结构体的名称
    func(car MyCar) beep(){
        fmt.Println(car.id)
    }
    
    
    func main() {
        //定义一个方法接收者
        c := MyCar{id:100}   //实例化这个结构体
        c.beep()  //通过这个结构体,调用这个方法
    }


    步骤:

    创建结构体

    创建 方法, 方法里绑定结构体

    实例化结构体

    通过结构体调用方法

    import (
        "fmt"
        "os/exec"
    )
    //定义一个结构体
    type Cmd struct {
        Path string
        Args []string
    }
    
    //获取用户输入的命令
    func Command(name string, arg ...string) *Cmd {
        cmd := &Cmd{
            Path: name,
            Args: append([]string{name}, arg...),
        }
        if filepath.Base(name) == name {
            if lp, err := LookPath(name); err != nil {
                cmd.lookPathErr = err
            } else {
                cmd.Path = lp
            }
        }
        return cmd
    }
    
    
    //执行用户输入的命令,跟Cmd这个结构体绑定,通过Cmd这个结构体可以调用这个方法
    func (c *Cmd) CombinedOutput() ([]byte, error) {
        fmt.Printf("aaaaa: %s 
    ",c)
        if c.Stdout != nil {
            return nil, errors.New("exec: Stdout already set")
        }
        if c.Stderr != nil {
            return nil, errors.New("exec: Stderr already set")
        }
        var b bytes.Buffer
        c.Stdout = &b
        c.Stderr = &b
        err := c.Run()
        return b.Bytes(), err
    }
    
    func main(){
        var (
            cmd  *Cmd    //初始化 这个结构体
            output []byte
            err error
        )
    
        cmd = Command("D:\cygwin\bin\bash.exe","-c","df -h")   //实例化这个结构体,把Command函数获取到的值 赋值给cmd这个结构体
    
    
        if output,err = cmd.CombinedOutput();err != nil{     //通过cmd这个结构体调用这个方法, 结构体这个方法是绑定的,所以结构体能调用这个方法
            fmt.Println(err)
    
        }
        fmt.Println(string(output))
    
    }

    https://www.jianshu.com/p/6fa443a19267 方法看这个文章

    接口

    接口的定义

    //定义一个接口,这个接口里,可以放一堆方法
    type test interface {
        PrintPerson()
    }
    
    //定义一个结构体
    type Person struct{
        Name  string
        Age int
    }
    
    //定义一个方法的具体实现
    //这个方法和结构体绑定,Person是结构体,person是结构体传进来时供方法内部调用的的变量,下面可以通过person这个变量访问到结构体的 字段
    func (person Person) PrintPerson(){
        fmt.Printf("I am %s , age is %d 
    ", person.Name,person.Age)
    }
    
    func main() {
        //把接口test 赋值给p这个变量
        var p test 
        //通过p去实例化 结构体,并给结构体字段赋值
        p = Person{Name: "翟军铭", Age: 18}
        //通过结构体去调用方法
        p.PrintPerson()
    }

    https://www.runoob.com/go/go-interfaces.html 接口看这个文章

  • 相关阅读:
    kthread_run
    05 七段数码管的实现
    Docker 面临的安全隐患,我们该如何应对
    7 天玩转 ASP.NET MVC — 第 6 天
    哪些问题困扰着我们?DevOps 使用建议
    如何使用 OneAPM 监控微软 Azure Cloud Service ?
    在 Java 中如何更高效地存储和管理 SQL 语句?
    规模化敏捷开发的10个最佳实践(上)
    如何在 Swift 语言下使用 iOS Charts API 制作漂亮图表?
    PHP 性能分析与实验——性能的宏观分析
  • 原文地址:https://www.cnblogs.com/chadiandianwenrou/p/13815213.html
Copyright © 2011-2022 走看看