Go语言-为什么返回值为接口类型,却返回结构体

 

Go语言-为什么返回值为接口类型,却返回结构体_Golang_脚本之家 (jb51.net)

 

golang中的函数参数值传递和引用传递 - Go语言中文网 - Golang中文社区 (studygolang.com)

 

(70条消息) golang:接收器一一方法作用的目标[指针类型和非指针类型接收器]_OceanStar的学习笔记的博客-CSDN博客_golang 接收器

 

https://cloud.tencent.com/developer/article/1446307?from=15425

 https://studygolang.com/articles/20041

https://blog.csdn.net/uudou/article/details/52456133

package main
import "fmt"
// 定义属性结构
type Property struct {
value int // 属性值
}
// 设置属性值
func (p *Property) SetValue(v int) {
// 修改p的成员变量
p.value = v
}
// 取属性值
func (p *Property) Value() int {
return p.value
}
func main() {
// 实例化属性
p := new(Property)
// 设置值
p.SetValue(100)
// 打印值
fmt.Println(p.Value())
}

结果 0

package main
import "fmt"
// 定义属性结构
type Property struct {
value int // 属性值
}
// 设置属性值
func (p *Property) SetValue(v int) {
// 修改p的成员变量
p.value = v
}
// 取属性值
func (p *Property) Value() int {
return p.value
}
func main() {
// 实例化属性
p := new(Property)
// 设置值
p.SetValue(100)
// 打印值
fmt.Println(p.Value())
}

结果100





Golang 函数返回类型是接口时返回对象的指针还是值

1.接口简介

Interface 是一组抽象方法(未具体实现的方法,仅包含方法名参数返回值的方法)的集合,如果实现了 interface 中的所有方法,即该类型就实现了该接口。

注意: (1)接口中不能含有属性; (2)每种类型都能实现多个接口; (3)未初始化的接口类型变量的值为 nil。

接口声明格式:

type InterfaceName interface {
    //方法列表  
}  

2.函数返回类型是接口时返回对象的指针还是值

函数返回类型是接口时返回对象的指针还是值,这个要看具体的需要。期望原对象在后续的操作中被修改则返回对象的指针。返回对象的值则返回的是对象的副本,对对象副本的修改不会影响原对象。

返回对象的指针示例。

package main

import (
        "fmt"
)

    type Men interface {
        Print()
        Set()
    }   

   type Employee struct {
        company string
    }   
   
  
   func (e *Employee) Set() {
        e.company="alibaba"
   }   
  
   func (e *Employee) Print() {
        fmt.Printf("company=%v\n", e.company)
   }   

var e = Employee {
    company:"tencent",
}

//返回对象的指针
func createEmployeeObj() Men {
    return &e  
}

func main() {
    o:=createEmployeeObj()
    o.Set()
    o.Print()
	e.Print()
}

输出结果:

company=alibaba
company=alibaba

可见函数返回类型是接口时返回对象的指针,后续对该对象的修改操作则会改变原对象。

返回对象的值示例。

package main

import (
        "fmt"
)

    type Men interface {
        Print()
        Set()
    }   

   type Employee struct {
        company string
    }   
   
  
   func (e Employee) Set() {
        e.company="alibaba"
   }   
  
   func (e Employee) Print() {
        fmt.Printf("company=%v\n", e.company)
   }   

var e = Employee {
    company:"tencent",
}

//返回对象的指针
func createEmployeeObj() Men {
    return e 
}

func main() {
    o:=createEmployeeObj()
  
  //go中的类型判断则是判断一个变量是否属于某一种类型
    e1,ok := o.(Employee)
    if ok {
        e1.company="alibaba"
        e1.Print()
    }   
    e.Print()
}

输出结果:

company=alibaba
company=tencent

可见函数返回类型是接口时返回对象的值,后续对该对象的副本进行修改并不会改变原对象。


参考文献

[1]GoLang之方法与接口

https://cloud.tencent.com/developer/article/1446307?from=15425go中的类型判断则是判断一个变量是否属于某一种类型https://studygolang.com/articles/20041
posted @   rincloud  阅读(498)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示