Golang极简入门教程(二):方法和接口

 更新时间:2014年10月27日 09:42:00   投稿:junjie  
这篇文章主要介绍了Golang极简入门教程(二):方法和接口,本文同时讲解了错误、匿名域等内容,需要的朋友可以参考下

方法

在 Golang 中没有类,不过我们可以为结构体定义方法。我们看一个例子:

复制代码 代码如下:

package main
 
import (
    "fmt"
    "math"
)
 
type Vertex struct {
    X, Y float64
}
 
// 结构体 Vertex 的方法
// 这里的方法接收者(method receiver)v 的类型为 *Vertex
func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
 
func main() {
    v := &Vertex{3, 4}
    fmt.Println(v.Abs())
}

在这里方法的接收者使用指针类型而非值类型主要出于以下几点考虑(类似 C/C++ 等语言):

1.避免方法每次调用时,对接收者的不必要的拷贝
2.在方法内可以修改接收者的值

我们可以为任意类型定义方法,但以下情况除外:

1.如果类型定义在其他包中,不能为其定义方法
2.如果类型是基础类型,不能为其定义方法

复制代码 代码如下:

package main
 
import (
    "fmt"
    "math"
)
 
// 定义一个类型 MyFloat
type MyFloat float64
 
// 注意此方法关联的类型是 MyFloat 而不是 *MyFloat
func (f MyFloat) Abs() float64 {
    if f < 0 {
        return float64(-f)
    }
    return float64(f)
}
 
func main() {
    f := MyFloat(-math.Sqrt2)
    fmt.Println(f.Abs())
}

接口(interface)

接口也是一种类型(就像结构体一样)。一个接口类型包含了一组方法,一个接口类型能够持有那些实现了这些方法的值。范例:

复制代码 代码如下:

// 定义接口 Abser
type Abser interface {
    Abs() float64
}
 
// 定义结构体 Vertex
type Vertex struct {
    X, Y float64
}
 
// 实现方法 Abs
func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
 
func main() {
    v := Vertex{3, 4}
    // 成功,能够持有 *Vertex 类型的值
    var a Abser = &v
    // 出错,不能持有 Vertex 类型的值
    // 因为在 *Vertex 上定义了方法 Abs,而未在 Vertex 上定义
    var b Abser = v
}

错误

Golang 提供了一个 error 接口:

复制代码 代码如下:

type error interface {
    Error() string
}

我们通过 os.Open 函数来了解一下 error 的用法:

复制代码 代码如下:

// 此函数用于打开一个文件
// 返回的第二个值为 error 类型
func Open(name string) (file *File, err error)

简单的例子:

复制代码 代码如下:

package main
 
import (
    "fmt"
    "os"
)
 
func main() {
    _, err := os.Open("test.txt")
    // 如果 err 不为 nil 表示存在错误
    if err != nil {
        fmt.Println(err)
    }
}

创建一个 error 值的最简单方式是使用 errors.New 函数:

复制代码 代码如下:

func Sqrt(f float64) (float64, error) {
    if f < 0 {
        // 出错时返回一个错误
        return 0, errors.New("math: square root of negative number")
    }
    // ...
}

我们也可以定义一个新的 error 的实现(也就是实现接口 error):
复制代码 代码如下:

type NegativeSqrtError float64
 
func (f NegativeSqrtError) Error() string {
    return fmt.Sprintf("math: square root of negative number %g", float64(f))
}

匿名域

结构体中可以存在只有类型而没有名字的域,它们被叫做匿名域。例如:

复制代码 代码如下:

struct {
    T1
    *T2
}

一个结构体的匿名域中的域或者方法可以被此结构体实例直接访问:

复制代码 代码如下:

package main
 
import "fmt"
 
type Car struct {
    wheelCount int
}
 
func (car *Car) numberOfWheels() int {
    return car.wheelCount
}
 
type Ferrari struct {
    Car
}
 
func main() {
    f := Ferrari{Car{4}}
    fmt.Println("A Ferrari has this many wheels: ", f.numberOfWheels())
}

相关文章

  • golang模板template自定义函数用法示例

    golang模板template自定义函数用法示例

    这篇文章主要介绍了golang模板template自定义函数用法,结合实例形式分析了Go语言模板自定义函数的基本定义与使用方法,需要的朋友可以参考下
    2016-07-07
  • 解决Go语言数据库中null值的问题

    解决Go语言数据库中null值的问题

    这篇文章主要介绍了解决Go语言数据库中null值的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang Web 框架Iris安装部署

    Golang Web 框架Iris安装部署

    这篇文章主要为大家介绍了Golang Web 框架Iris安装部署,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Gorm存在时更新,不存在时创建的问题

    Gorm存在时更新,不存在时创建的问题

    这篇文章主要介绍了Gorm存在时更新,不存在时创建的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • GO web 数据库预处理的实现

    GO web 数据库预处理的实现

    本文主要介绍了GO web 数据库预处理的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • golang中对

    golang中对"引用传递"的误解

    这篇文章主要介绍了golang中对“引用传递”的误解,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • Mac OS系统安装golang教程

    Mac OS系统安装golang教程

    这篇文章主要介绍了Mac OS系统安装golang教程,本文还同时介绍了Sublime Text开发工具的配置,需要的朋友可以参考下
    2015-01-01
  • golang方法中receiver为指针与不为指针的区别详析

    golang方法中receiver为指针与不为指针的区别详析

    这篇文章主要给大家介绍了关于golang方法中receiver为指针与不为指针区别的相关资料,其实最大的区别应该是指针传递的是对像的引用,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-10-10
  • Golang 如何限制木马图片上传服务器的实例

    Golang 如何限制木马图片上传服务器的实例

    本文主要介绍了Golang 如何限制木马图片上传服务器的实例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 一文带你搞懂Golang结构体内存布局

    一文带你搞懂Golang结构体内存布局

    结构体在Go语言中是一个很重要的部分,在项目中会经常用到。这篇文章主要带大家看一下结构体在内存中是怎么分布的?通过对内存布局的了解,可以帮助我们写出更优质的代码。感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助
    2022-10-10

最新评论