首页 > 其他分享 >Go 快速入门指南 - 接口和方法

Go 快速入门指南 - 接口和方法

时间:2022-12-22 16:46:25浏览次数:43  
标签:perimeter ... 入门 area age 接口 func Go name

接口

Go 接口是隐式实现。 对于一个数据类型,无需声明它实现了哪些接口,只需要实现接口必需的方法即可。当然了,存在一个小问题就是: 我们可能无意间实现了某个接口:) ,所以 命名 是多么重要的一件事情。

语法规则

type 接口名称 interface {
    方法1名称(参数列表 ...) 返回值列表...
    方法2名称(参数列表 ...) 返回值列表...
    方法3名称(参数列表 ...) 返回值列表...
    ...
    ...
}

例子

求矩形和圆的周长, 面积

package main

import (
    "fmt"
    "math"
)

// 声明一个图形接口
type geometry interface {
    area() float64
    perimeter() float64
}

// 多个字段类型相同时,可以并列声明
type rectangle struct {
    width, height float64
}

type circle struct {
    radius float64
}

// rectangle 隐式实现了 geometry 接口的 area 方法
func (r *rectangle) area() float64 {
    return r.width * r.height
}

// rectangle 隐式实现了 geometry 接口的 perimeter 方法
func (r *rectangle) perimeter() float64 {
    return (r.width + r.height) * 2
}

// circle 隐式实现了 geometry 接口的 area 方法
func (c *circle) area() float64 {
    return math.Pi * c.radius * c.radius
}

// circle 隐式实现了 geometry 接口的 perimeter 方法
func (c *circle) perimeter() float64 {
    return 2 * math.Pi * c.radius
}

func main() {
    r := &rectangle{
        width:  10,
        height: 5,
    }
    fmt.Printf("Rectangle area = %.2f, perimeter = %.2f \n", r.area(), r.perimeter())

    c := &circle{
        radius: 10,
    }
    fmt.Printf("Circle area = %.2f, perimeter = %.2f \n", c.area(), c.perimeter())
}

// $ go run main.go
// 输出如下 
/**
  Rectangle area = 50.00, perimeter = 30.00
  Circle area = 314.16, perimeter = 62.83
*/

方法

方法的声明和普通函数的声明类似,只是在函数名字前面多了一个 接收者参数 (接收者参数将方法绑定到其对应的数据类型上)。方法可以绑定到任何数据类型上,但是大多数情况下,绑定的都是 结构体。

语法规则

func (接收者参数) 方法名称(参数列表 ...) 返回值列表... {
    // do something
}

例子

结构体方法

package main

import "fmt"

type person struct {
    name string
    age  int16
}

func (p person) sayName() {
    fmt.Printf("Hi, my name is %s\n", p.name)
}

func (p person) sayAge() {
    fmt.Printf("Hi, my age is %d\n", p.age)
}

func main() {
    tom := &person{
        name: "Tom",
        age:  6,
    }
    tom.sayName()
    tom.sayAge()
}

// $ go run main.go
// 输出如下 
/**
  Hi, my name is Tom
  Hi, my age is 6
*/

结构体指针方法

相比结构体方法,指针结构体方法除了将方法参数变为指针外,在引用对应的字段时,无需加 * 标识符, 这一点和普通指针变量引用时有所区别,需要注意。

package main

import "fmt"

type person struct {
    name string
    age  int16
}

func (p *person) sayName() { // 结构体为指针类型
    fmt.Printf("Hi, my name is %s\n", p.name)
}

func (p *person) sayAge() { // 结构体为指针类型
    fmt.Printf("Hi, my age is %d\n", p.age)
}

func main() {
    tom := &person{
        name: "Tom",
        age:  6,
    }
    tom.sayName()
    tom.sayAge()
}

// $ go run main.go
// 输出如下 
/**
  Hi, my name is Tom
  Hi, my age is 6
*/

编译检测

编译器会对方法的 接收者参数 进行检查,具体来说:

  • • 接收者形参为普通变量类型

  • • 实参为普通变量类型,编译正常

  • • 实参为指针变量类型,编译正常

  • • 接收者形参为指针变量类型

  • • 实参为普通变量类型,编译报错

  • • 实参为指针变量类型,编译正常

联系我

公众号

标签:perimeter,...,入门,area,age,接口,func,Go,name
From: https://www.cnblogs.com/duanbiaowu/p/16998855.html

相关文章

  • Go 快速入门指南 - init 函数
    概述init()函数 是一个特殊的函数,一般称为初始化函数,不能被调用。 在每个文件里面,当程序启动或者文件被作为包引用的时候,init()函数就会自动执行,一般用来做一些包的......
  • Go 快速入门指南 - 零值和错误
    零值当一个变量使用 var 进行声明后并未进行初始化(变量后面没有赋值符 =)操作,会默认分配一个零值(zerovalue)。不同类型对应的零值类型零值boolfalse......
  • Go 快速入门指南 - 判断是否实现接口
    判断是否实现接口Go里面没有 implements 关键字来判断一个结构体(对象)是否实现了某个接口, 要实现类似的功能,需要用到 类型断言。类型断言// 判断 v 是否实......
  • Go 快速入门指南 - 字符切片
    概述建议先阅读 字符串, 切片 两个小节。由于字符串不可变,如果每次以 重新赋值 的方式改变字符串,效率会非常低,这时应该使用 []byte 类型,[]byte元素可以被修改。......
  • Go 快速入门指南 - 切片
    概述阅读本小节之前,建议先阅读 数组 小节。切片 是对数组的一个连续片段的引用。片段可以是整个数组,也可以是数组的一部分(例如数组的第3个元素到第8个元素)。所......
  • Go 快速入门指南 - Map
    概述Map 是一种键值对的无序集合,在其他编程语言中也被称为 字典, Hash, 关联数组。重要的一点是: Map键 的数据类型必须是可以比较的,例如 string, int, float6......
  • Go 快速入门指南 - make 和 new
    概述new() 函数为数据类型T分配一块内存,初始化为类型T的零值,返回类型为指向数据的指针,可以用于所有数据类型。make() 函数除了为数据类型T分配内存外,还可以指定......
  • Go 快速入门指南 - 有序 Map
    概述Map 的遍历是无序的,这意味着不能依赖遍历的键值顺序。如果想实现Map遍历时顺序永远一致,一个折中的方案时预先给Map的 键 排序,然后根据排序后的键序列遍历Map......
  • Go 快速入门指南 - 变长参数和指针参数
    变长参数在函数的最后一个参数的数据类型之前加上省略号 ... ,表示该参数的数据类型是 变长类型,调用该函数时可以传递任意数量 (0-N) 的该类型的参数。一个函数......
  • Go 快速入门指南 - defer 函数
    概述一个 defer 语句就是一个普通的函数或方法调用。 defer 语句保证了不论是在正常情况下(return返回),还是非正常情况下(发生错误,程序终止),函数或方法都能够执......