[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 @   SNYang  阅读(177)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示