Go语言方法应用

Posted Go程序员开发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言方法应用相关的知识,希望对你有一定的参考价值。

Go语言方法应用

匿名字段

Go语言支持只提供类型,而不写字段名的方式,也就是匿名字段,也称为嵌入字段。

当匿名字段是一个struct的时候,那么这个struct所拥有的全部字段都被隐式地引入了当前定义的这个struct。

Go语言匿名字段可以像字段成员那样访问匿名字段方法,编译器负责查找。

package main

import "fmt"

type Student struct {
    id   int
    name string
}

type Course struct {
    Student
}

func (self *Student) ToString() string {
    return fmt.Sprintf("Student: %p, %v", self, self)
}

func main() {
    c := Course{Student{1"oldboy"}}
    fmt.Printf("Course: %p\n", &c)
    fmt.Println(c.ToString())
}

运行结果:

Class: 0xc0420023e0
User: 0xc0420023e0, &{1 oldboy}

Go 语言不像其它面相对象语言一样可以写个类,然后在类里面写一堆方法,但其实Go语言的方法很巧妙的实现了这种效果:我们只需要在普通函数前面加个接受者(receiver,写在函数名前面的括号里面),这样编译器就知道这个函数(方法)属于哪个struct了。

继承复用

Go语言中没有继承,但是可以依靠组合来模拟继承和多态。

通过匿名字段,可获得和继承类似的复用能力。依据编译器查找次序,只需在外层定义同名方法,就可以实现。

package main

import "fmt"

type Student struct {
    id   int
    name string
}

type Course struct {
    Student
    title string
}

func (self *Student) ToString() string {
    return fmt.Sprintf("Student: %p, %v", self, self)
}

func (self *Course) ToString() string {
    return fmt.Sprintf("Course: %p, %v", self, self)
}

func main() {
    c := Course{Student{1"oldboy"}, "Golang"}

    fmt.Println(c.ToString())

    fmt.Println(c.Student.ToString())
}

运行结果:

Course: 0xc04207e060, &{{1 oldboy} Golang}
Student: 0xc04207e060, &{1 oldboy}

自定义ERROR
错误是可以用字符串描述自己的任何东西。 可以由预定义的内建接口类型 error,和其返回字符串的方法 Error 构成。

type error interface {
Error() string
}

当用 fmt 包的多种不同的打印函数输出一个 error 时,会自动的调用该方法。

package main

import (
    "fmt"
    "os"
    "time"
)

type PathError struct {
    path       string
    op         string
    createTime string
    message    string
}

func (p *PathError) Error() string {
    return fmt.Sprintf("path=%s \nop=%s \ncreateTime=%s \nmessage=%s", p.path,
        p.op, p.createTime, p.message)
}

func Open(filename string) error {

    file, err := os.Open(filename)
    if err != nil {
        return &PathError{
            path:       filename,
            op:         "read",
            message:    err.Error(),
            createTime: fmt.Sprintf("%v", time.Now()),
        }
    }

    defer file.Close()
    return nil
}

func main() {
    err := Open("/oldboy/golang.go")
    switch v := err.(type) {
    case *PathError:
        fmt.Println("get path error,", v)
    default:
    }
}

下一篇:

Go语言接口定义------敬请期待!

0基学习Go语言系列:

第一章 环境搭建

   1.1   

   1.2   

   1.3   

第二章 Go语言基础

   2.1   

   2.2   

   2.3   

   2.4   

   2.5   

第三章 Go语言程序结构

   3.1   

   3.2   

   3.3   

   3.4   

第四章 Go语言基本类型

   4.1   

   4.2   

   4.3   

   4.4   

   4.5   

第五章 Go语言引用类型

   5.1   

   5.2   

   5.3   

第六章 自定义类型与指针

   6.1   

   6.2   

   6.3   

第七章 流程控制

   7.1   

   7.2   

   7.3   

   7.4   

   7.5   

   7.6   

第八章 函数

   8.1   

   8.2   

   8.3   

   8.4   

   8.5   

   8.6   

   8.7   

第九章 方法

   9.1   

   9.2   


看完本文有收获?那就分享给更多人吧

以上是关于Go语言方法应用的主要内容,如果未能解决你的问题,请参考以下文章

go语言使用go-sciter创建桌面应用 事件处理,函数与方法定义,go与tiscript之间相互调用

go语言使用go-sciter创建桌面应用 view对象常用方法,文件选择,窗口弹出,请求

Go语言方法应用

实战演示 Go 反射的使用方法和应用场景

go语言使用go-sciter创建桌面应用 ui元素查找,增加,删除,修改

windows通过Visual Studio Code中配置GO开发环境(转)