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 接口看这个文章

原文地址:https://www.cnblogs.com/chadiandianwenrou/p/13815213.html