[golang] 概念: struct vs interface

struct vs interface

go语言的简化哲学:

class = struct + receiver method set

注意:

  • go 语言的struct,在参数传递中,是值拷贝。

struct 的代码示例

package main

import (
	"fmt"
	"math"
)

type CircleStruct struct {
	x float64
	y float64
	r float64
}

// 使用 receiver 来定义 CircleStruct 的 一个方法
func (c *CircleStruct) area() float64 {
	return math.Pi * c.r * c.r
}

// 结构体的参数的传入是一个拷贝,里面的改动不会影响原值。
func circlePlusBad(c CircleStruct) {
	c.x += 1
}

// 使用 receiver 来定义 CircleStruct 的 一个方法
func (c *CircleStruct) circlePlusGood() {
	c.x += 1
}

func main() {
	// init: 结构体可以默认初始化
	var c CircleStruct
	fmt.Println(c)

	// init: 使用 new 返回一个指针
	var c2 *CircleStruct = new(CircleStruct)
	fmt.Println(c2)

	// init: 初始化内部的字段
	c3 := CircleStruct{x: 0, y: 0, r: 5}
	fmt.Println(c3)

	// init: 初始化内部的字段(是用了字段的顺序)
	c4 := CircleStruct{0, 0, 5}
	fmt.Println(c4)

	// 调用结构的方法
	fmt.Println(c4.area())

	// 测试结构的参数传入。
	circlePlusBad(c)
	fmt.Println("Bad, no change:", c)

	// 测试结构体的参数传入
	c.circlePlusGood()
	fmt.Println("Good, changed:",c)
}

interface

go 语言中的接口 interface 用于定义方法集。

结构体和接口之间是松散耦合,结构体的定义中,没有地方说明会实现什么接口。

在编译的过程中,将结构体的变量转为接口变量的时候,才会做检查。如果一个变量没有实现对应接口的方法,会扔出编译错误。

演示代码:

package main

import (
	"fmt"
)

// 接口的定义
type CircleInterface interface {
	area() float64
}

// 接口的使用
func calcArea(c CircleInterface) float64 {
	return c.area()
}

func main() {
	// init: 初始化内部的字段(是用了字段的顺序)
	c4 := CircleStruct{0, 0, 5}

	// 调用接口的方法
	fmt.Println(calcArea(&c4))
}


posted @ 2021-04-03 17:43  SNYang  阅读(175)  评论(0编辑  收藏  举报