美文网首页
结构体,方法和接口

结构体,方法和接口

作者: bocsoft | 来源:发表于2018-11-29 10:08 被阅读0次
package main

import "math"

//在 Go 语言中 interface resolution 是隐式的。如果传入的类型匹配接口需要的,则编译正确。
//Shape is implemented by anything that can tell us its Area
type Shape interface {
    Area() float64
}

//Rectangle has the dimensions of a rectangle
type Rectangle struct {
    Width  float64
    Height float64
}
//方法和函数很相似,但是方法是通过一个特定类型的实例调用的。
//函数可以随时被调用,比如Perimeter(rectangle Rectangle)。不像方法需要在某个事物上调用。


//声明方法的语法跟函数差不多,因为他们本身就很相似。唯一的不同是方法接收者的语法 func(receiverName ReceiverType) MethodName(args)。
//当方法被这种类型的变量调用时,数据的引用,通过变量 receiverName 获得。在其他许多编程语言中这些被隐藏起来并且通过 this 来获得接收者。
//把类型的第一个字母作为接收者变量是 Go 语言的一个惯例。 例如:r Rectangle

//Area returns the area of the rectangle
func (r Rectangle) Area() float64 {
    return r.Width * r.Height
}

//Perimeter returns the perimeter of the rectangle
func Perimeter(rectangle Rectangle) float64 {
    return 2 * (rectangle.Width + rectangle.Height)
}

//Circle represents a circle...
type Circle struct {
    Radius float64
}

//Area returns the ares of the circle
func (c Circle) Area() float64 {
    return math.Pi * c.Radius * c.Radius
}

//Triangle represents the dimensions of a triangle
type Triangle struct {
    Base   float64
    Height float64
}

//Area returns the area of the triangle
func (t Triangle) Area() float64 {
    return (t.Base * t.Height) * 0.5
}


package main

import "testing"

func TestPerimeter(t *testing.T) {
    rectangle := Rectangle{10.0, 10.0}
    got := Perimeter(rectangle)
    want := 40.0

    if got != want {
        t.Errorf("got %.2f want %.2f", got, want)
    }
}

func TestArea(t *testing.T) {
    areaTests := []struct {
        name    string
        shape   Shape
        hasArea float64
    }{
        {name: "Rectangle", shape: Rectangle{Width: 12, Height: 6}, hasArea: 72.0},
        {name: "Circle", shape: Circle{Radius: 10}, hasArea: 314.1592653589793},
        {name: "Triangle", shape: Triangle{Base: 12, Height: 6}, hasArea: 36.0},
    }

    for _, tt := range areaTests {
        got := tt.shape.Area()
        if got != tt.hasArea {
            t.Errorf("got %.2f want %.2f", got, tt.hasArea)
        }
    }
}







相关文章

  • 结构体,方法和接口

  • 10. Go极简教程 Interface接口

    接口 interface 接口声明了方法集合 如果某个结构体实现了接口内的所有方法, 就可以把该结构体赋值给接口 ...

  • 23 Golang中的接口(三)

    结构体值接收者和指针接收者实现接口的区别 值接收者如果结构体中的方法是值接收者,那么实例化后的结构体值类型和指针类...

  • Golang结构体、方法、接口

    结构体是一种聚合的数据类型,它是由一系列具有相同类型或不同类型的数据结构组成的数据集合。每个数据成为结构体的成员。...

  • Go结构体、方法、接口

    1 结构体 Go语言中没有“类”的概念,也不支持像继承这种面向对象的概念。但是Go语言的结构体与“类”都是复合结构...

  • go 结构体、方法、接口

    输出

  • go学习笔记(4) - 结构体、接口

    结构体与方法 工厂函数返回局部变量地址 结构体专有方法 结体构综合示例 接口 问题集锦 new与make new只...

  • 2021-02-16

    什么是接口? 我们在结构和方法课程中讨论了很多关于对象和行为的内容。 我们学习了结构体(以及其他非结构类型)实现方...

  • Golang基础

    基础 定义变量 函数 循环 条件语句 指针 结构体 数组和切片 map 函数传参传函数 方法 接口 Reader ...

  • 函数、结构体和接口

    函数 在 Go 中,函数是一等公民。 也就是说,函数可以作为一个值,在其他的函数之间**传递、赋予变量、类型判断和...

网友评论

      本文标题:结构体,方法和接口

      本文链接:https://www.haomeiwen.com/subject/xtsxcqtx.html