前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >golang函数参数中接口指针的传递

golang函数参数中接口指针的传递

作者头像
千灵域
发布于 2022-06-17 04:51:16
发布于 2022-06-17 04:51:16
2.6K00
代码可运行
举报
文章被收录于专栏:challenge filterchallenge filter
运行总次数:0
代码可运行

其实是一个很简单的问题,但是如果是之前一直写go的话可能没有意识到指针的本质,就走不出来了。

最近写代码的时候遇到了一个问题:有一个功能需要使用一个接口,有多个结构体实现了这个接口(经典OO场景)。这些方法中,有一些方法可以修改结构体中的指定属性,并且有一个对应的方法来返回这个属性。

出于业务需要,值被修改的地方和它被使用的地方是不同的。由于要和原有代码兼容,希望这个代码尽量表现的与原来的一样。

一个小demo,直接返回interface值来完成传递。看着很正常,但是因为是传值,所以与原有代码不太一致,也不够直观。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

type tt interface {
	setName(string)
	getName() string
}

type testA struct{
	name string
}

type testDouble struct{
	name string
}

func (t *testA) setName(n string){
	t.name = n
}
func (t *testA) getName() string{
	return t.name
}

func (t *testDouble) setName(n string){
	t.name = n + n
}
func (t *testDouble) getName() string{
	return t.name
}


func setName(s tt,n string) tt{
	t := testA{}
	t.setName("test")
	s = &t
	s.setName(n)
	return s
}

func main(){
	var s tt
	s = setName(s,"tset2")
	fmt.Println(s.getName())
    /*
    //origin code need get Name after set
	var a testA
	setsetName(&a,"test")
	fmt.Println(a.getName())
    */
}

但如果试图使用接口直接作为函数参数的时候,会报错

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func setName(s *tt,n string) tt{
	//t := testA{}
	t := testDouble{}
	t.setName("test")
	s = &t
	s.setName(n)
	return s
}

func main(){
	var s tt
	s = setName(&s,"tset2")
	fmt.Println(s.getName())
}

s=&t的地方会报错:Cannot use '&t' (type *testDouble) as type *tt,非指针的情况下会报错Cannot use 't' (type testDouble) as type *tt

这里比较让人迷惑的地方在于,interface tt = testDouble是很容易成立的(编译器支持),可是指针层面却并不像想象中这样继续支持,强制转换也是不行的。这个应该是与golang的底层实现相关了,现在暂时没空拆。

这个问题的实际实现上倒也不难想,直接绕回去即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//s所对应的内容设置完成之后应该能够返回
func setName(s *tt,n string){
	//t := testA{}

	//s里面的内容应该与t是相同的
	t := testDouble{}
	t.setName("test")

	//对应的接口变量
	var regular tt = &t
	regular.setName(n)

	*s =  regular//完成转换

	fmt.Println(regular.getName())
	fmt.Println(s,*s)
}

func main(){
	var s tt
	setName(&s,"tset2")
	fmt.Println(&s,s)
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Golang之接口(interface)
 //Golang中的接口,不需要显示的实现。只要一个变量,含有接口类型中的所有方法,那么这个变量就实现了这个接口。
超蛋lhy
2018/08/31
1K0
GoLang接口---中
上一篇文章中,我们对接口的基本使用和底层实现做了简单的了解,本文对接口的一些使用技巧做相关陈述。
大忽悠爱学习
2022/08/23
5980
GoLang接口---中
golang 中的抽象 -- 接口的全面解读
之前的文章中,我们介绍了如何通过 golang 的语法实现面向对象的基本特性。 通过 GoLang 实现面向对象思想
用户3147702
2022/06/27
6440
golang 中的抽象 -- 接口的全面解读
Java的类与Golang的结构体的区别
Java作为一门面向对象(OOP)的编程语言,它有类(class)的存在,而对于Golang,它不完全遵从OOP编程语言的设计思想,但它也有类似Java类的结构存在,那就是结构体(struct)。
程序新视界
2023/11/13
2390
Java的类与Golang的结构体的区别
Go语言与面向对象编程
学习Go语言差不多快两个月了,感觉这个过程还是蛮快乐的,翻翻英文资料,写写小程序,总是觉得有好多东西都搞不明白,一步步走下来,却发现,这些迷惑好像也是不可或缺的。慢慢思考,最终也找到了解决方法,可能不是最好的,但是我会随着认识的不断深入,继续修改。 因为Java的东西在我的知识体系中是根深蒂固的,尽管我现在很讨厌java体系中的一些东西。对于曾经搞过java的人来说,去学习任何一门新的语言,首先会问,是否是面向对象的语言。刚接触GO的几天,曾经带我的师傅问我go是不是一门面向对象的语言,我闪烁其词,因为我还
李海彬
2018/03/22
1.1K0
Golang的继承和多态实现
Golang并非设计成了一种面向对象的语言,没有Class的概念,因此在继承和多态的实现上有些让人难以快速理解的地方。
有财君
2023/03/08
1.3K0
Golang的继承和多态实现
GoLang接口---上
但是 Go 语言里有非常灵活的 接口 概念,通过它可以实现很多面向对象的特性。接口提供了一种方式来 说明 对象的行为:如果谁能搞定这件事,它就可以用在这儿。
大忽悠爱学习
2022/08/23
5690
GoLang接口---上
浅谈Go语言中的结构体struct & 接口Interface & 反射
结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套;
李海彬
2018/07/26
1.1K0
浅谈Go语言中的结构体struct & 接口Interface & 反射
100天精通Golang(基础入门篇)——第20天:Golang 接口 深度解析☞从基础到高级
🪁🍁 希望本文能给您带来价值🌸如果有任何不足,欢迎批评指正!🐅🐾🍁🐥
猫头虎
2024/04/09
1140
100天精通Golang(基础入门篇)——第20天:Golang 接口 深度解析☞从基础到高级
Go 接口
像Channel和协程一样,Go语言的接口设计也是其一大特色。不像Java、C++、PHP等语言,一个类要实现接口必须明确声明,在Go语言中一个类型只要实现了接口中所有的方法,就认为该类型实现了此接口。这种更加松散的实现方式,使面向对象编程变得更加简单。
一行舟
2022/08/25
2400
golang中的接口、函数、方法
Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。
ccf19881030
2020/12/16
1.3K0
Go 延迟调用 defer 用法详解
defer (延迟调用)是 Go语言中的一个关键字,一般用于释放资源和连接、关闭文件、释放锁等。 和defer类似的有java的finally和C++的析构函数,这些语句一般是一定会执行的(某些特殊情况后文会提到),不过析构函数析构的是对象,而defer后面一般跟函数或方法。
一个会写诗的程序员
2022/05/13
1.2K0
Golang与Java全方位对比总结
Golang: 编码风格及可见域规则严格且简单;Java: 来说层次接口清晰、规范,主要表现有以下这些。
腾讯技术工程官方号
2023/07/15
1.2K0
Golang与Java全方位对比总结
Go 专栏|接口 interface
翻译过来就是:如果某个东西长得像鸭子,游泳像鸭子,嘎嘎叫像鸭子,那它就可以被看成是一只鸭子。
AlwaysBeta
2021/09/07
3820
Go 专栏|接口 interface
一文搞懂Golang中的接口
Go语言中的接口(interface)是一组方法签名的集合,是一种抽象类型。接口定义了方法,但没有实现,而是由具体的类型(struct)实现这些方法,因此接口是一种实现多态的机制。
周小末天天开心
2023/10/16
1.8K0
Golang简介
指定GOPATH为将要工作的目录,然后将bin添加到PATH中,输入命令go env查看
老高的技术博客
2022/12/28
4320
go之4种类型转换
go语言是静态类型语言,对变量的类型有严格的要求,因而在日常编写代码过程中,经常需要对变量的类型进行转换操作。这里介绍下go语言支持的4种类型转行方法。
willsiom
2023/11/14
1.5K0
A Bite of GoLang(上)
A bite of GoLang(浅尝GoLang),本文只是Go语言的冰山一角,本文包含作者学习Go语言期间积累的一些小的经验,同时为了方便让读者了解到Go语言中的一些概念,文中包含了许多快速简洁的例子,读者后期可以去自行拓展。当然写这篇文章的灵感来源于GitHub上的 a bite of Python
盛国存
2018/05/14
1.2K4
A Bite of GoLang(上)
golang教程
这里有两个关键点。 - 其一是defer关键字。defer语句的含义是不管程序是否出现异常,均 在函数退出时自动执行相关代码。 - 其二是Go语言的函数允许返回多个值。
陨石坠灭
2018/10/19
1.7K0
golang教程
【Golang语言社区】Golang语言面试题
最近在很多地方看到了golang的面试题,看到了很多人对Golang的面试题心存恐惧,也是为了复习基础,我把解题的过程总结下来。
李海彬
2018/03/07
3.9K2
【Golang语言社区】Golang语言面试题
相关推荐
Golang之接口(interface)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验