[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))
}
[golang] 概念: struct vs interface的更多相关文章
- Golang面向API编程-interface(接口)
Golang面向API编程-interface(接口) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Golang并不是一种典型的面向对象编程(Object Oriented Pr ...
- GoLang获取struct的tag
GoLang获取struct的tag内容:beego的ORM中也通过tag来定义参数的. 获取tag的内容是利用反射包来实现的.示例代码能清楚的看懂! package main import ( &q ...
- partial、struct、interface与C#和CLR的关系
partial.struct.interface是C#编译器特有的,CLR对此一无所知.
- Golang 通过创建临时结构体实现 struct 内 interface struct 的 json 反序列化
原文链接 背景 type AData struct { A string `json:"a"` } type BData struct { B string `json:" ...
- golang type 和断言 interface{}转换
摘要 类型转换在程序设计中都是不可避免的问题.当然有一些语言将这个过程给模糊了,大多数时候开发者并不需要去关 注这方面的问题.但是golang中的类型匹配是很严格的,不同的类型之间通常需要手动转换,编 ...
- Go语言学习笔记(四)结构体struct & 接口Interface & 反射
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
- golang自定义struct字段标签
原文链接: https://sosedoff.com/2016/07/16/golang-struct-tags.html struct是golang中最常使用的变量类型之一,几乎每个地方都有使用,从 ...
- Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
- Golang之接口(interface)
Golang最重要的接口,,,, package main import ( "fmt" ) //interface类型默认是指针 /* 接口的实现 Golang中的接口,不需要显 ...
- Golang高效实践之interface、reflection、json实践
前言 反射是程序校验自己数据结构和类型的一种机制.文章尝试解释Golang的反射机制工作原理,每种编程语言的反射模型都是不同的,有很多语言甚至都不支持反射. Interface 在将反射之前需要先介绍 ...
随机推荐
- redis-shake
https://github.com/alibaba/RedisShake/wiki/%E8%BF%90%E8%A1%8C%E7%9B%91%E6%8E%A7 redis-shake is a too ...
- 基于CefSharp开发浏览器(十)浏览器CefSharp.Wpf中文输入法偏移处理
一.前言 两年多来未曾更新博客,最近一位朋友向我咨询中文输入法问题.具体而言,他在使用CefSharp WPF版本时遇到了一个问题,即输入法突然出现在屏幕的左上角.在这里记录下处理这个问题的过程,希望 ...
- 神经网络优化篇:详解超参数调试的实践:Pandas VS Caviar(Hyperparameters tuning in practice: Pandas vs. Caviar)
超参数调试的实践 如今的深度学习已经应用到许多不同的领域,某个应用领域的超参数设定,有可能通用于另一领域,不同的应用领域出现相互交融.比如,曾经看到过计算机视觉领域中涌现的巧妙方法,比如说Confon ...
- Docker容器基础入门认知-Namespce
在使用 docker 之前我一般都认为容器的技术应该和虚拟机应该差不多,和虚拟机的技术类似,但是事实上容器和虚拟机根本不是一回事. 虚拟机是将虚拟硬件.内核(即操作系统)以及用户空间打包在新虚拟机当中 ...
- 2023年第七届蓝帽杯初赛wp
取证检材容器密码:Hpp^V@FQ6bdWYKMjX=gUPG#hHxw!j@M9 案情介绍 2021年5月,公安机关侦破了一起投资理财诈骗类案件,受害人陈昊民向公安机关报案称其在微信上认识一名昵称为 ...
- Harbor系统文章01---Linux安装Harbor
1.切换到指定目录下载harbor安装包 wget https://ghproxy.com/https://github.com/goharbor/harbor/releases/download/v ...
- 【4】配置和运行Opencv常见的一些问题总结,以及bug解决。
相关文章: [1]windows下安装OpenCV(4.3)+VS2017安装+opencv_contrib4.3.0配置 [2]Visual Studio 2017同时配置OpenCV2.4 以及O ...
- 【3】VSCode 主题设置推荐,自定义配色方案,修改注释高亮颜色
相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...
- 【6】opencv采用映射技术实现鱼眼镜头校正和鱼眼镜头还原全景图。
相关文章: [1]windows下安装OpenCV(4.3)+VS2017安装+opencv_contrib4.3.0配置 [2]Visual Studio 2017同时配置OpenCV2.4 以及O ...
- C/C++ 常用排序算法整理
(伪)冒泡排序算法: 相邻的两个元素之间,如果反序则交换数值,直到没有反序的记录为止. #include <stdio.h> void BubbleSort(int Array[], in ...