首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我不能在需要*interface{}的地方使用指向特定类型的指针?

在Go语言中,interface{}表示一个指向空接口类型的指针。空接口类型可以表示任意类型的值,因此interface{}可以指向任意类型的指针。

然而,在需要*interface{}的地方使用指向特定类型的指针是不允许的。这是因为指向特定类型的指针与空接口类型是不兼容的。

接口类型是一种抽象的类型,它定义了一组方法的集合。指向特定类型的指针只能访问该类型的方法,而不能访问其他类型的方法。因此,如果在需要*interface{}的地方使用指向特定类型的指针,将无法调用该指针所指向类型的方法,从而违反了接口的定义。

另外,使用指向特定类型的指针也会限制代码的灵活性和可扩展性。接口类型的优势之一是可以接受任意类型的值,使得代码更加通用和可复用。如果在需要*interface{}的地方使用指向特定类型的指针,将无法接受其他类型的值,导致代码的可用性受限。

因此,为了保持代码的灵活性和可扩展性,应该遵循接口的定义,不在需要*interface{}的地方使用指向特定类型的指针。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

轻松理解Go中内存逃逸问题

内存逃逸危害 堆是一块没有特定结构,也没有固定大小内存区域,可以根据需要进行调整。 全局变量,内存占用较大局部变量,函数调用结束后不能立刻回收局部变量都会存在堆里面。...局部变量在函数调用结束后还被其他地方使用,比如函数返回局部变量指针或闭包中引用包外值。因为变量生命周期可能会超过函数周期,因此只能放入堆中。 在 slice 或 map 中存储指针。...在 interface 类型上调用方法时会把interface变量使用堆分配, 因为方法真正实现只能在运行时知道。...避免使用长度固定slice切片,在编译期无法确定切片长度,只能将切片使用堆分配。 interface调用方法会发生内存逃逸,在热点代码片段,谨慎使用。...避免内存逃逸需要遵循如下两个原则: 指向栈对象上指针不能被存储到堆中。 指向栈对象上指针不能超过该栈对象声明周期。

50131

轻松理解Go中内存逃逸问题

内存逃逸危害 堆是一块没有特定结构,也没有固定大小内存区域,可以根据需要进行调整。 全局变量,内存占用较大局部变量,函数调用结束后不能立刻回收局部变量都会存在堆里面。...局部变量在函数调用结束后还被其他地方使用,比如函数返回局部变量指针或闭包中引用包外值。因为变量生命周期可能会超过函数周期,因此只能放入堆中。 在 slice 或 map 中存储指针。...在 interface 类型上调用方法时会把interface变量使用堆分配, 因为方法真正实现只能在运行时知道。...避免使用长度固定slice切片,在编译期无法确定切片长度,只能将切片使用堆分配。 interface调用方法会发生内存逃逸,在热点代码片段,谨慎使用。...避免内存逃逸需要遵循如下两个原则: 指向栈对象上指针不能被存储到堆中。 指向栈对象上指针不能超过该栈对象声明周期。

15610

泛型和元编程模型:Java, Go, Rust, Swift, D等

这种方法叫做 "vtables"(由 "虚拟方法表 "缩写而来),它实现方式是,在通用结构中每个对象偏移量为0地方,都有一个指向函数指针指针。...这些表通过在固定偏移量处索引某些指针,让通用代码以同样方式为每个类型查找特定类型函数指针。 译者注,图示如下: ?...当你把一个类型转换为一个接口类型时,它会创建一个包装器,这个包装器包含一个指向原始对象指针和一个指向该接口特定类型函数vtable指针。...然而这需要额外指针和内存,这也是为什么Go中排序需要切片实现Sort.Interface接口,而非切片元素实现Comparable接口。...,这也是为什么Rust可以使用同一个类型系统来支持这两种泛型原因!

3K30

高性能 Go 服务内存优化(译)

如果切片背后存储要基于运行时数据进行扩充,就会在堆上分配。 4、在 interface 类型上调用方法。在 interface 类型上调用方法都是动态调度 —— 方法真正实现只能在运行时知道。...一般情况下我们会这样认为:“值拷贝是昂贵,所以用一个指针来代替。” 但是,在很多情况下,直接值拷贝要比使用指针廉价多。你可能要问为什么。 1、编译器会在解除指针时做检查。...对于那些包含指针数组和 struct 数据类型也是一样。 译者注: 垃圾回收器回收一个变量时,要检查该类型里是否有指针。...如果有,要检查指针指向内存是否可被回收,进而才能决定这个变量能否被回收。如此递归下去。 如果被回收变量里面没有指针, 就不需要进去递归扫描了,直接回收掉就行。...还是关于指针 减少指针使用就意味着要深入我们自定义数据类型

1.2K50

interface引发事件真相

为什么我会选择去写一个关于interface文章那,认为他在go语言里面有这非常重要地位,仅次于goroutine和channel地位,在未接触go之前一直从事于c#开发,接口对来说就是不同组件之间契约...//空接口 _type *_type //类型信息 data unsafe.Pointer //指向数据指针(go语言中特殊指针类型...//存储type信息还有结构实现方法集合 data unsafe.Pointer //指向数据指针(go语言中特殊指针类型unsafe.Pointer类似于c语言中void*...会提示没有实现该接口,只要我们把var peo People = Stduent{}修改为var peo People = &Stduent{}就可以了,为什么会有这种限制, 这是因为接口定义规定实现者是否应该使用指针接收还是值接收实现接口...当使用接口时,不能保证底层类型是值还是指针

66660

神奇Runtime

这个对象特定方法;否则,消息要么被转发,或是临时向receiver动态添加这个selector对应实现内容,要么就干脆崩溃掉。... objc_class {       struct objc_class *isa; //指向该对象所属类型类型对象(Class Object),而类isa指针指向metaclass... *cache;   //因为Objective-C消息转发需要查找dispatch table甚至可能需要遍历继承体系,所以缓存最近使用方法。       ...其中类定义了成员变量和成员方法列表。对象通过对象isa指针指向类。 每一个类本质上都是一个对象,类其实是元类(meteClass)实例。元类定义了类方法列表。类通过类isa指针指向元类。...isa指针(is kind of 意思)指向维护分发表对象类,该分发表实际上包含了指向实现类中方法指针和其他数据。

57420

Golang中interface内部构造与面试真题分析

所以上述代码报错地方在var peo People = Stduent{}这条语句, Student{}已经重写了父类People{}中Speak(string) string方法,那么只需要用父类指针指向子类对象即可...(People为interface类型,就是指针类型) 二、interface内部构造(非空接口iface情况) 01 以下代码打印出来什么内容,说出为什么?...指向数据指针(go语言中特殊指针类型unsafe.Pointer类似于c语言中void*) } _type属性:是GO语言中所有类型公共描述,Go语言几乎所有的数据结构都可以抽象成 _type,...} data属性: 表示指向具体实例数据指针,他是一个unsafe.Pointer类型,相当于一个C万能指针void*。...uintptr // 函数指针指向具体类型所实现方法 } 其中值得注意字段,个人理解如下: interface type包含了一些关于interface本身信息,比如package

47620

GO 方法集

只有在使用类型调用指针类型方法时, 编译会报错, 其他情况都 OK....t := Test{} t.print() 十分确定, t变量不是指针, 但他就可以调用呀. 查了查发现, 是GO在编译时候帮我们隐式做了取址操作. 那为什么这里可以帮忙, 上面就不行了呢?...而当参数是指针类型时候, 对指针类型复制并传递, 方法接收到是一个地址值, 虽然此地址值是一个副本, 但是指向仍然是原对象....那也就意味着, 如果传是一个较大对象, 进行值传递, 会将整个对象全拷贝一份, 然后传递过去, 而传递指针需要拷贝8字节指针数据就可以了, 不过如果传入了指针类型, 就要直面在方法内部可能会对对象进行修改风险...虽然这样在使用时候就不用特意区分变量类型是值还是地址, 但是有的地方帮我转了, 有的地方又不管我了, 感觉怪怪. 再习惯习惯.

48420

iOS中内存管理

,这时得回收一些不需要再次使用内存空间,比如收一些不需要使用对象、变量等 若果APP占用内存过大,系统会强制关闭APP,造成闪退,影响用户体验 内存管理 内存管理:就是管理内存分配和清除 内存管理涉及操作有...struct enum 等) 注:为什么只有OC对象才需要进行内存管理本质原因 OC对象存放于堆里面(堆内存系统不会自动释放,需要手动释放) 非OC对象一般放在栈里面(栈内存会被系统自动回收释放...直接调用dealloc 不要在dealloc方法中调用其他方法 一旦对象被回收了,它占内存就不再可用 野指针和空指针指针 只要一个对象被释放了,我们就称这个对象为“僵尸对象” 当一个指针指向一个僵尸对象...,我们就称为这个指针为野指针 只要给一个野指针发送消息就会报错 空指针 没有指向存储空间指针(里面存是nil,也就是0) 为了避免给野指针发送消息会报错,一般情况,当一个对象被释放后我们就会将这个对象指针置为空指针...基本上能够避免内存泄漏 有时还能更加快速,因为编译器还可以执行某些优化 ARC判断原则 只要没有强指针指向对象,对象就会被释放 强指针 //默认所有指针变量都是强指针 Person *p =

19710

《GO语言圣经》读书笔记(一)

关键字 Go 语言中关键字有 25 个;关键字不能用于自定义名字,只能在特定语法结构中使用。...简单变量声明 ==只能在函数内部== 名字 := 表达式 // 只能在函数内部 指针 一个变量对应一个保存了变量对应类型内存空间。一个指针值是另一个变量地址。...通过指针,我们可以直接读或更新对应变量值,而不需要知道该变量名字(如果变量有名字的话)。...如果用,==var x int== 声明一个x 变量,那么 &x表达式(取x变量内存地址)将产生一个指向该整数变量指针。该指针类型是 *int,指针被称之为,指向int类型指针。...新命名类型提供了一个方法,用来分隔不同概念类型,这样即使它 们底层类型相同也是兼容

44820

Android JNI(一)——NDK与JNI基础

为什么Google还提供NDK,我们就一起研究下 三、为什么使用NDK 上面提及了 NDK不适合大多数初级Android 工程师,由于它增加了开发复杂度,所以对许多类型Android其实也没有大作用...这意味着指针不能从一个线程进入另一个线程。然而,可以在不同咸亨中调用本地方法。 ?...层定义地方法,能够在不同线程调用,因此能够接受不同JNIEnv 2.6、JNIEnv结构 JNIEnv是一个指针指向一个线程相关结构,线程相关结构,线程相关结构指向JNI函数指针数组,这个数组中存放了大量...JNI函数指针,这些指针指向了详细JNI函数。...,与全局引用类似,创建跟删除都需要由编程人员来进行,这种引用与全局引用一样可以在多个本地带阿妈有效,不一样是,弱引用将不会阻止垃圾回收期回收这个引用所指向对象,所以在使用需要多加小心,它所引用对象可能是不存在或者已经被回收

2K32

Golang interface 接口详细原理和使用技巧

任何一个 interface{} 类型变量都包含了2个指针,一个指针指向类型,对应 pair 中 type,这个 type 类型包括静态类型 (static type,比如 int、string......)和具体类型(concrete type,interface指向具体类型),另外一个指针指向实际值,对应 pair 中 value。...(type) 方式来对一个 interface 进行强制类型转换,但是如果这个 interface 被转换为一个包含指定类型类型,那么就会出现 panic 。...因为一个 interface{} 类型变量包含了2个指针,一个指针指向类型,另外一个指针指向实际值。...对一个 interface{} 类型 nil 变量来说,它两个指针都是0;但是 var a State 传进去后,指向类型指针不为0了,因为有类型了, 所以比较为 false。

94020

Golang interface知多少

什么是interface interface即接口一词,在面向对象程序编程中,我们经常会听到“接口”这个名词。例如在java中,一个class要实现一个接口,需要显示使用implement关键字。...// 指向数据指针,对于值类型变量,指向是值拷贝一份后地址 // 对于指针类型变量,指向是原数据地址 data unsafe.Pointer } // 非空接口,含有method...构造过程中会查找itab表,如果类型匹配, 或者不是属于同一个 interface 类型,都会失败。...如果去掉第一个匹配项,iface会跟Animal匹配上,因为它也是Animal 类型,fallthrough 语句不能在 Type Switches 中使用。强行使用,编译器会报错。...itab.inter指向当前接口类型元数据, 记录着接口需要实现哪些方法, itab.

46110

Java-JVM

(ClassLoader)再把字节码加载到内存中方法区,执行引擎将字节码翻译成底层系统指令,再交由 CPU 去执行,而交由 CPU 去执行这个过程中需要调用本地接口(Native Interface)...目前主流访问方式有句柄和直接指针两种方式。 指针指向对象,代表一个对象在内存中起始地址。 句柄: 可以理解为指向指针指针,维护着对象指针。...句柄直接指向对象,而是指向对象指针(句柄不发生变化,指向固定内存地址),再由对象指针指向对象真实内存地址。...直接指针 如果使用直接指针访问,引用 中存储直接就是对象地址,那么Java堆对象内部布局中就必须考虑如何放置访问类型数据相关信息。 优势:速度更快,节省了一次指针定位时间开销。...image.png 深拷贝和浅拷贝 浅拷贝:增加一个指针指向一个已存在内存地址 深拷贝:增加一个指针并申请一块新内存,使这个增加指针指向这个新内存, 深拷贝和浅拷贝区别就是在于会不会申请新内存

1K30

学习go语言编程之面向对象

类型系统 类型系统是指一个语言类型体系结构,一个典型类型系统通常包含如下基本内容: 基础类型,如:byte、int、bool、float等 复合类型,如:数组、结构体、指针等 可以指向任意对象类型...如果要求对象必须以指针传递,这有时会是个额外成本,因为对象有时很小(比如4个字节),用指针传递并不划算。 只有在需要修改对象时候才必须使用指针。...// 需要修改对象时候才必须使用指针 func (a *Integer) Add(b Integer) { *a += b } 值语义和引用语义 值语义和引用语义差别在于赋值,如下示例: b =...成员方法可见性也遵循同样规则,如: func (r *Rect) area() float64 { return r.Width * r.Height } 这样Rect类型成员方法area()就只能在类型所在包内使用...可以认为接口组合是类型匿名组合一个特定场景,只不过接口只包含方法,而包含任何成员变量。

12510

真的理解go interface了吗?

前言 想,对于各位使用面向对象编程程序员来说,"接口"这个名词一定陌生,比如java中接口以及c++中虚基类都是接口实现。...表示第二种包含任何方法接口,第二种在我们日常开发中经常使用到,所以在实现时使用了特殊类型。...} 这里只包含指向底层数据和类型两个指针,从这个type我们也可以推断出Go语言任意类型都可以转换成interface。...这里也是很疑惑,为什么Go没有帮助我们自动把slice转换成interface类型slice,之前做项目就想这么用,结果失败了。...后来终于找到了答案,有兴趣可以看看原文,这里简单总结一下:interface会占用两个字长存储空间,一个是自身 methods 数据,一个是指向其存储值指针,也就是 interface 变量存储

22910

深入Go:sync.Map

随着了解深入,我们又有了疑惑:为什么不像Java SE 8之前ConcurrentHashMap一样,使用分段锁?为什么在内部需要一个哨兵指针expunged?...: 使用read和dirty两个map来保存键值,map值为指向entry指针,entry存储指向真实值指针需要向dirty中插入新值时,如果dirty为空则将除entry.p ==...为什么需要可并发访问Map Map是Go语言中广泛使用数据结构,但它并不是可并发读写。...使用map作为底层实现,因此其内部继承了map良好读写性能;不过其依赖底层map存储“值”并不是存用户提供值,而是指向entry指针类型,用以判断对应键值状态,关于entry代码如下:...为了弄清楚为什么使用expunged,我们需要知道: 指针在什么时候会变为expunged为什么不仅仅使用nil 第一点,通过阅读代码我们知道,一个entryp变为expunged当且仅当在加锁后

1.3K30

C++笔试面试题整理

如果使用了这个修饰词,就是通知编译器别犯懒,老老实实去重新读一遍!可能太“通俗”了,那么引用一下“大师”标准解释: volatile本意是“易变”。...1.指针是一个变量,只不过这个变量存储是一个地址,指向内存一个存储单元;而引用仅是个别名; 2.引用使用时无需解引用(*),指针需要解引用; 3.引用只能在定义时被初始化一次,之后不可变;指针可变;...谈谈你对指针理解? 指针是一个变量,该变量专门存放内存地址; 指针变量类型取决于其指向数据类型,在所指数据类型前加* 指针变量特点是它可以访问所指向内存。...对于一个频繁使用短小函数,在C语言中应用什么实现,在C++中应用什么实现? c用宏定义,c++用inline 描述实时系统基本特性 在特定时间内完成特定任务,实时性与可靠性。...单向,非传递,不能继承。 成员函数通过什么来区分不同对象成员数据?为什么它能够区分? 答:通过this指针指向对象首地址来区分。 对象都具有的两方面特征是什么?分别是什么含义?

2.5K30

iOS 开发:彻底理解 iOS 内存管理(ARC 篇)

使用 ARC 后,系统会检测出何时需要保持对象,何时需要自动释放对象,何时需要释放对象,编译器会管理好对象内存,会在何时地方插入 retain、release 和 autorelease,通过生成正确代码去自动释放或者保持对象...__strong:强指针,默认所有对象指针变量都是强指针类型。只要还有一个强指针指向某个对象,则这个对象就会一直存活。 __weak:弱指针,不能持有对象实例。...ARC 使用 在 MRC 时代,我们需要自己调用 retain 方法去持有一个对象,而现在不需要。我们唯一需要使用一个指针指向这个对象,只要这个指针没有被置空,对象就会一直保持在堆上。...这样,如果赋值参数为可变类型,当赋值参数发生改变时候,使用 strong 修饰对象也会跟着改变,因为两者指向是同一个地址。...而使用 copy 修饰对象则不会跟着改变,这是因为 copy 指针指向是一个新对象。

52910

深度阅读之《100 Go Mistakes and How to Avoid Them》

还有一些瑕疵地方是第 8 章关于 M 描述是错误…… 关于书名,作者还找了几个为什么要从 mistakes 中学习理由:我们印象最深知识点一定是在犯错场景下学到。...意思就是只有在实现过程中发现需要 interface 时才需要定义。是自下而上过程,而非相反。...为什么 recover 一定要写在 defer 里才生效呢?因为只有在 defer 里语句才能在发生 panic 后也能执行。还有个问题是为什么 recover 非得要包一层才能有效呢?...这是 Go 明确规定。可能有两方面原因:recover 有一个返回值,它表示 panic 原因,所以得有地方把它“打印”出来;Go 在实现上需要用到栈层级关系。具体需要深入研究下源码。...value,例如 key 是一个指针指向 struct)问题,所以就自定义了一个 blankCtx 来拦截 String() 方法,消除并发问题。

88910
领券