• [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))
    }
    
    
    
    非常感谢阅读!如有不足之处,请留下您的评价和问题。
    请“推荐”本文!
  • 相关阅读:
    数组按行访问和按列访问的区别
    解决github中图片无法显示问题的策略
    C#验证帮助类(手机号、身份证等)
    WPF圆角按钮样式
    弗洛伊德的本我、自我与超我概念
    KEPServerEX OPCUA服务器地址配置
    C#List的一些操作
    梦、清醒梦、梦魇
    类说明head部格式
    阅读笔记20222
  • 原文地址:https://www.cnblogs.com/steven-yang/p/14614356.html
Copyright © 2020-2023  润新知