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))
}

[golang] 概念: struct vs interface的更多相关文章

  1. Golang面向API编程-interface(接口)

    Golang面向API编程-interface(接口) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Golang并不是一种典型的面向对象编程(Object Oriented Pr ...

  2. GoLang获取struct的tag

    GoLang获取struct的tag内容:beego的ORM中也通过tag来定义参数的. 获取tag的内容是利用反射包来实现的.示例代码能清楚的看懂! package main import ( &q ...

  3. partial、struct、interface与C#和CLR的关系

    partial.struct.interface是C#编译器特有的,CLR对此一无所知.

  4. Golang 通过创建临时结构体实现 struct 内 interface struct 的 json 反序列化

    原文链接 背景 type AData struct { A string `json:"a"` } type BData struct { B string `json:" ...

  5. golang type 和断言 interface{}转换

    摘要 类型转换在程序设计中都是不可避免的问题.当然有一些语言将这个过程给模糊了,大多数时候开发者并不需要去关 注这方面的问题.但是golang中的类型匹配是很严格的,不同的类型之间通常需要手动转换,编 ...

  6. Go语言学习笔记(四)结构体struct & 接口Interface & 反射

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...

  7. golang自定义struct字段标签

    原文链接: https://sosedoff.com/2016/07/16/golang-struct-tags.html struct是golang中最常使用的变量类型之一,几乎每个地方都有使用,从 ...

  8. Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...

  9. Golang之接口(interface)

    Golang最重要的接口,,,, package main import ( "fmt" ) //interface类型默认是指针 /* 接口的实现 Golang中的接口,不需要显 ...

  10. Golang高效实践之interface、reflection、json实践

    前言 反射是程序校验自己数据结构和类型的一种机制.文章尝试解释Golang的反射机制工作原理,每种编程语言的反射模型都是不同的,有很多语言甚至都不支持反射. Interface 在将反射之前需要先介绍 ...

随机推荐

  1. [转帖]线上Java 高CPU占用、高内存占用排查思路

    一.前言 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题.当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警.本文主要针对系统 ...

  2. Nginx的再学习

    第一部分 Nginx的版本 Nginx官网提供了三个类型的版本 Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版 Stable version:最 ...

  3. ESXi 虚拟机性能情况简单验证

    1.虚拟化的CPU超售问题. 经过查找资料, 发现 ESXi 5.5 的版本 一个 物理CPU的Core 可以虚拟出 25个vCPU, 升级到ESXi6.0 之后可以虚拟化32个vCPU. 所以虚拟化 ...

  4. FinClip 小程序的自有账户体系是怎么做的?

    随着公司规模越来越大,员工需要使用的产品矩阵也会越来越丰富,不仅包括内部的 IT 系统,OA 系统,业务系统,还会有很多和外部产品集成的登录流程,更别提各种业务系统或者子系统中的账户体系了.如果使用简 ...

  5. 谈JVM参数GC线程数ParallelGCThreads合理性设置

    作者:京东零售 刘乐 导读:本篇文章聚焦JVM参数GC线程数的合理配置,从ParallelGCThreads参数含义.参数设置,到参数实验以及修改意见进行解析. 1. ParallelGCThread ...

  6. 去除 i 标签的倾斜样式;如何引入本地的阿里字体图标

    去除 i 标签的倾斜样式 i{ font-style:normal; } 如何引入本地的阿里字体图标 将代码下载下来 当然你将下载下载来的资源有用的放在静态资源中 然后在 main.js 引入: ma ...

  7. vm-storage在全部都是新metric情况下的写入性能测试

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 vm-storage中,写入索引的性能要比写入data p ...

  8. springboot项目导入外部jar包的bean的几种方式

    背景 公司封装了基础包和日志包,将公共的配置抽取出来,供所有项目使用,因此就需要考虑,怎么引入外部jar包的Bean实例: 思考 因为公司的jar包就是普通的jar,不支持springboot的自动配 ...

  9. 全套解决方案:中文NLP训练框架,支持大模型训练和文本生成,快速上手,海量训练数据!

    全套解决方案:基于pytorch.transformers的中文NLP训练框架,支持大模型训练和文本生成,快速上手,海量训练数据! 1.简介 目标:基于pytorch.transformers做中文领 ...

  10. 9.0 Python 内置模块应用

    Python 是一种高级.面向对象.通用的编程语言,由Guido van Rossum发明,于1991年首次发布.Python 的设计哲学强调代码的可读性和简洁性,同时也非常适合于大型项目的开发.Py ...