go[4]-接口

6.4 Go语言中的空接口 空接口即interface{},也就是其中并没有对任务方法进行描述,既然没有约束,那么任务对象都满足空接口,简言之,空接口就是通配符。 阅读详情

概述

接口是对类型行为的抽象和概括。接口抽象的方法可以让我们函数更加灵活和适应性。中间只定义了函数类型。接口就是约定。
接口本事存储数据内容为:

type: xxx
value: xxx

定义实例

type interfaceName interface {
     Write([]byte)
     Read([]byte)
}

包含nil指针的接口不是nil接口

func main() {
 var buf *bytes.Buffer
 f(buf)
}
func f(out io.Writer) {
  if out != nil {
     out.Write([]byte("done!\n"))
 }
}

虽然已经对out做了空的判断,但是依然会崩溃。原因是这个调用f函数的时候,给了一个空的*bytes.Buffer指针。所以接口本身不是空。

类型断言

x为一个interface,T为一个定义的类型。

var w io.Writer
w = os.Stdout
f := w.(*os.File) // success
e := w.(*bytes.Buffer) // panic

如果转换失败了,将会直接造成panic。如果断言操作的对象是一个nil接口,无论被断言成什么类型都会失败。
使用两个返回值方式的,第二个参数将会返回是否转换成功。

b,ok :=w.(*bytes.Buffer)

我们可以拿着ok变量来做逻辑。
对于类型的switch case语句可以这样来编写

func sqlQuote(x interface{}) string {
    switch x:=x.(type) {
    case nil:
         return "NULL"
    case int,uint:
         return fmt.Sprintf("%d",x)
   default:
        panic(fmt.Sprintf("unexpected type: %T: %v",x,x))

一些建议

设计一个新的包时,先创建一个接口的集合开始,后面定义满足它们具体的类型。每个接口都实现一个。请不要这么做,这种接口是不必要去抽象。只有两个或者以上的具体类型必须以相同的方法进行处理时候才需要。ask only for what you need.(奥卡姆剃刀)

Quartz定时任务调度框架中的Misfire策略实战解析 本文深入解析了Quartz定时任务调度框架中的Misfire(失火)处理策略。针对SimpleTrigger和CronTrigger两种常用触发器,详细对比了其各自的Misfire指令(如NowWithExistingCount、FireAndProceed等)的核心行为与适用场景,并提供了基于不同业务需求(如数据补跑、时间点敏感度)的实战选型指南,帮助开发者构建更健壮可靠的任务调度系统。 阅读详情

相关推荐

原创_新魔百和CM201-1鸿蒙架构当贝乐家语音安卓9线刷固件包刷机教程可救砖rom刷机包

不用担心变砖,因为系统内核会自动判断分区及CPU等级,假设你CPU是高于S905L3的那么。7.adb功能支持,系统增加开机自启功能,添加老人桌面模式,默认为年轻化桌面;所以我发的这个固件可适用于_cw_ys_zg_zn代工上生产的盒子进行刷机;5.CPU及GPU算法更改,当观看4K片源时,AI智能会自动优化系统后台进程,正如我所说,本固件是采用安卓公版镜像制作而成,那么代工厂也是使用的公版镜像,1.移植鸿蒙架构代码,完美融合安卓系统,增加系统的稳定性;刷机的时候 他会自动短接链接,所以不存在变砖。

a138088150的博客 1万+

go语言的type func()用法

在go语言中,type可以定义任何自定义的类型 比如熟悉的:type dog struct{},type myInt int 等等 所以func也是可以作为类型自定义的,type myFunc func(int) int,意思是自定义了一个叫myFunc的函数类型,这个函数的签名必须符合输入为int,输出为int 已知,相同底层类型的变量之间是可以相互转换的,例如从一个取值范围小的int16转为取值范围大的int32 所以,自定义的 myInt 和 int 之间也是可以转换的 type myIn

hjxisking的专栏 1万+

Facebook登录协议逆向实战:从加密参数到完整流程解析(附Python代码)

本文深入解析Facebook登录协议的逆向工程,重点拆解`lgndim`和`encpass`等加密参数的生成逻辑,并提供完整的Python实现代码。通过Base64解码和RSA加密技术,帮助开发者理解并实现Facebook登录流程,同时涵盖工程优化与安全实践。

weixin_30687051的博客 476

Golang笔记 4.2 go 接口

接口是使用方法的抽象,使当前程序可以更聚焦在方法的应用,不关心该方法的具体实现。后续的应用程序在做具体实现时,再去完善具体实现,不会影响之前程序已经定义好的逻辑。 更通俗地来讲,接口的定义,就像是设置了一个岗位,描述了岗位的职责;,一些规章可以先根据岗位职责来制定,不关心具体是谁来任职这个岗位。当应用程序开始执行的时候,需要给接口传入一个实例,相当于企业开始运营时再把一个人放到这个岗位。

IoT小能手 834

DINOv2 基于自定义数据集进行图片分类预测

(前提是安装好pytorch)1. pip安装2. 下载dinov2提供的预训练模型,需要自行前往网站上查找dinov2模型进行下载。模型需要下载三个文件:下载完成后将上述三个文件放置在本地一个名为dinov2_base的文件夹中即可。

sinat_34770838的博客 6665

核心面试聚焦:业务问题+系统问题+设计题---字节、阿里、美团等整理统计

业务系统及其他相关面试问题整理:线上相关问题排查+高并发系统的限流+高并发秒杀系统设计+负载均衡+一个网站有 20 亿 url 存在一个黑名单中,这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中?并且需在给定内存空间(比如:500M)内快速判断出?

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 172万+

Golz4:高效压缩的Golang接口

Golz4:高效压缩的Golang接口 在软件开发中,数据压缩是提高存储效率和传输速度的关键技术。今天,我们为大家推荐一个优秀的开源项目——golz4,它为Golang开发者提供了一种简单、高效的LZ4压缩方法。 项目介绍 golz4 是一个Golang语言的接口,用于实现LZ4压缩算法。LZ4是一种快速的数据压缩算法,它以其高压缩速度和良好的压缩率而受到广泛青睐。golz4 项目旨在为Go开发者...

gitblog_00920的博客 690

新能源汽车动力总成研发测试技术全景深度报告(2025版)

本文所有企业案例数据均来自上市公司财报、工信部备案信息及权威媒体报道,技术参数经第三方检测报告交叉验证。研发测试人员能力矩阵重构(T型人才进阶路径)[10] 全球动力总成市场2035年预测报告。[9] NI电动汽车HIL测试架构技术文档。[3] 东风汽车智能化研发体系深度报告。[5] 混合动力测功机发明专利技术细节。[1] 领克动力总成试验中心技术解析。[7] 新能源汽车产业迭代趋势白皮书。测试架构师-数字工程。测试架构师-安全合规。测试架构师-人工智能。

优快云-新能源汽车研发测试专业博主 776

【Go 1.26.4】Golang Interface 接口深度解析

【Go 1.26.4】Golang Interface 接口深度解析

zhonglinzhang 199

高数15种常见特殊曲线:星形线、心形线、摆线、对数螺线、双曲螺线、阿基米德螺线、伯努利双纽线、三叶玫瑰线、四叶玫瑰线、六叶玫瑰线、三次抛物线、半立方抛物线、箕舌线、蔓叶线、笛卡儿叶形线、概率曲线

4.1 对数螺线(等角螺线、生长螺线)三叶玫瑰线、四叶玫瑰线、六叶玫瑰线。​7.2 半立方抛物线(尼尔曲线)10.笛卡儿叶形线(茉莉花瓣曲线)常考选择题、填空题,大题也涉及。​4.2 双曲螺线(倒数螺线)11.阿基米德螺线(等速螺线)3.摆线(圆滚线、旋轮线)5.双纽线(伯努利双纽线)1.星形线(四尖瓣线)2.心形线(心脏线)..................

刘鑫磊 1万+

基于STM32的浴室环境智能控制系统设计

摘要:本文设计了一款基于STM32F103的智能卫浴系统,通过多传感器协同检测浴室环境参数。系统采用DS18B20检测环境与卫浴温度,DHT11监测湿度,MQ-135检测空气质量,光敏电阻测量光照强度,D203S人体热释电模块检测人员存在。当检测到异常参数时,系统自动启动相应调节功能:温度异常时控制加热/制冷继电器,湿度过高时启动通风除湿,空气质量差时进行换气,光照不足且有人时自动开灯。系统支持按键、蓝牙APP和语音三种控制方式,可手动设置参数阈值、切换防雾模式、控制音乐播放等功能。实验结果表明,该系统能有

3254968421的博客 482

自学golang【4.1go语言的接口练习代码】

本次练习包含以下三个文件: 主函数代码: package main import ( "2/testing" "fmt" ) //读取网页html //func main() { // resp, err := http.Get("https://www.imooc.com") // if err != nil { // panic(err) // } // defer resp.Body.Close() // bytes, _ := ioutil.ReadAll(resp.Body) /.

立志冲海大 328

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Go语言封装的ZeroMQ v4接口:zmq4项目解析

`zmq4` 是一个由 [优快云公司开发的InsCode AI大模型](#) 引介的优秀开源项目,它提供了一个用于Go语言的ZeroMQ版本4的接口。ZeroMQ是一个著名的消息队列库,旨在简化分布式系统之间的通信。此项目使得Go开发者能够轻松地在他们的应用中集成高性能的消息传递机制,而无需深入了解底层的C/C++实现细节。项目完全用Go语言编写,但依赖于系统的ZeroMQ库。 ## 核心功能...

gitblog_01023的博客 876

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

探索高效通信:zmq4 Go接口介绍

在现代分布式计算和网络通信领域,ZeroMQ以其高效的消息传递机制而闻名。今天,我们将深入探讨一个强大的Go语言接口——zmq4,它为ZeroMQ版本4提供了全面的封装和支持。 ## 项目介绍 zmq4是一个Go语言接口,专门为ZeroMQ版本4设计。ZeroMQ,也称为ØMQ或0MQ,是一个高性能的异步消息传递库,旨在用于分布式或并发应用中。zmq4项目不仅提供了对ZeroMQ核心功能的访问...

gitblog_00459的博客 534

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Go(4)--接口

接口1. 基本概念1.1 接口声明1.1.1 声明新接口的特点1.2 接口初始化1.2.1 实例赋值接口1.2.2 接口变量赋值接口变量1.3 接口方法调用1.4 接口的动态类型和静态类型1.4.1 动态类型1.4.2 静态类型2. 接口运算2.1 类型断言2.2 类型查询2.3 接口优点和使用形式3. 空接口3.1 基本概念3.2 空接口的用途       Go的接口是非侵入式的设计,一个具体类型实现接口不需要在语法上显式地声明,只要具体类型的

wang_zhao_的博客 496

4.7 go接口定义

package main import "fmt" /** type Hummaner interface{ SayHi() } 1接口习惯以er结尾 2接口中只有方法声明,没有实现,没有数据字段 3接口可以嵌入其他接口,或嵌入其他结构中 多态的体现 **/ type Humaner interface { //只声明,有别的类型实现 SayHi() } type Stude...

码灵的博客 178

4.8 go 接口的继承

package main import "fmt" type Humaner interface { //超级接口 //只声明,有别的类型实现 SayHi() Actioner } type Actioner interface { //子接口 PlayBall(ball string) } type Student struct { name string age int ...

码灵的博客 377

Go,你也可以的!-【4.6 接口】

接口一般来说在开发一些工具库、框架时比较有用,与`Java`等语言不同但是也有类似的地方。 同时接口我们也会用在一些未知类型的判断上面,当我们不知道类型具体是什么时,我们也会使用接口来实现。

Swxctx 950

Go的学习旅程4:面向接口

1.面向接口的简单实现     因为go中没有class,只有结构体和方法,所以不存在class的继承与多态,但是我们可以通过interface

土豆科技的博客 6481

Go语言核心编程第4章 “接口”

Go语言编程"接口"

a9486的博客 1128

Golang学习笔记(4)面向接口

第四章 面向接口 duck typing的概念

hq20000的专栏 256

4.9 go空接口及断言

package main import "fmt" /** 01 空接口不包含任何方法,正因为如此所有的类型都实现了空接口 因此空接口可以存储任意类型的数值 var v1 interface{}=1 var v2 interface{}="abc" var v3 interface{}=&v2 **/ type Student struct { nam...

码灵的博客 593

golang学习4,glang的web接口

【代码】glang的web接口。

wangwei的博客 478

【go】gopl学习笔记(4.接口)

前言 我们都知道OOP有两个方式,组合和继承来组织类,分别表示has-a关系和is-a关系,能够实现代码复用、提升扩展性和灵活性。 前面一篇讲方法method阐述了go通过结构体struct嵌套实现对象的扩展(相对于Java类的组合,has a关系),outer结构体会自动生成包装方法委托给inner嵌套结构的方法,这样实现了方法代码的复用。这样有了组合has-a关系,go里面的is-a关系是怎么实现的呢?下面我们来看看接口interface~ 1.接口-合约 类似于Java中的接口,接口是一系列通

opi 497

Go 1.19.4 接口-Day 10

本章主要介绍接口的定义和使用。但说实话,我也没咋学明白这个接口,实际工作中到底有啥用。

qq_42515722的博客 934

go-clean-arch v4新特性:接口定义迁移至消费端的设计哲学

你是否在Go项目开发中遇到过模块耦合紧密、测试困难、重构风险高等问题?go-clean-arch v4版本通过"接口定义迁移至消费端"的设计革新,彻底解决了这些痛点。本文将深入解析这一核心特性的实现方式、带来的收益以及在实际项目中的应用方法,帮助你构建更灵活、更易维护的Go应用。 ## 什么是"接口定义迁移至消费端" 在传统架构设计中,接口通常由实现方定义,消费方被动依赖。而go-clean-...

gitblog_00365的博客 471
上一篇: go[3]-流程控制-函数
下一篇: go[5]-Goroutines Channels
erlang_hell
博客等级 码龄14年 57粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值