zoukankan      html  css  js  c++  java
  • [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))
    }
    
    
    
    非常感谢阅读!如有不足之处,请留下您的评价和问题。
    请“推荐”本文!
  • 相关阅读:
    Docker的历史
    IP路由基础
    Docker的基础知识(二)
    Docker的基础知识(一)
    CentOS7下安装部署“zabbix”
    使用amoeba实现mysql读写分离
    ?? 运算符(C# 参考)
    ?? 运算符(C# 参考)
    knockout,change事件
    knockout,change事件
  • 原文地址:https://www.cnblogs.com/steven-yang/p/14614356.html
Copyright © 2011-2022 走看看