首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[golang] 概念: struct vs interface

[golang] 概念: struct vs interface

作者头像
绿巨人
发布2021-04-09 14:48:04
6580
发布2021-04-09 14:48:04
举报
文章被收录于专栏:绿巨人专栏绿巨人专栏

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))
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-04-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • struct vs interface
  • struct 的代码示例
  • interface
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档