golang面向对象 实参和形参的类型解析

package main

type My struct {
    num int
}

func (self My) AddOne() {
    self.num++
}
func (self *My) AddTwo() {
    self.num += 2
}
// (1)结构指针接收者,顾名思义,会在方法内部改变该结构内部变量的值;
// (2)结构值接收者,在方法内部对变量的改变不会影响该结构。
func Test() {
    my1 := My{1} // 值接收者调用值方法  
    my1.AddOne() // 形参和实参一致 
    fmt.Println(my1.num)// 不改变num的值

    my2 := &My{1} // 指针接收者调用指针方法    
    my2.AddTwo()  // 形参和实参一致 
    fmt.Println(my2.num)// 改变num的值
}
// (3)对于结构指针接收者,如果你调用的是值方法,即使你是指针调用者,也不会改变你的结构内的变量值
// (4)对于值接收者,如果你调用的是指针方法,即使你是值调用者,也会改变你的结构内的变量值
func Test2() {
    my3 := My{1}// 值接收者调用指针方法   形参和实参不一致 
    my3.AddTwo()// 实际上编译器会对my3进行隐式的转换  将my3转化成&my3指针类型
    fmt.Println(my3.num) // 3 改变num的值

    my4 := &My{1}  // 指针接收者调用值方法  形参和实参不一致 
    my4.AddOne()   // 实际上 编译器会从my4指针类型中 解引用出my4实际的取值
    fmt.Println(my4.num)// 1 不改变num的值
}
// 不允许本身是指针类型的进行方法声明
总结: 只有三种情况满足方法表达式
1.实参和形参的类型一致  即都是T类型或者都是*T类型
2.实参是T类型  而形参数*T类型  编译器会隐式的将T转化成*T
3.实参是*T类型 而形参是T类型  编译器会隐式的解引用实参(接受者) 获得实际的取值。

 

Go语言是一门由Google开发的静态强类型、编译型编程语言。它以其简洁的语法结构高效的并发处理能力而闻名,并逐渐成为构建网络服务其他高性能应用的理想选择之一。 ### Go速成入门 #### 1. 环境搭建 首先你需要安装最新版本的Go环境,可以从[官方网站](https://golang.org/dl/)下载对应的平台安装包并按照指示完成安装过程。完成后通过命令行验证是否成功: ```bash go version ``` 如果显示了已安装的具体版本信息,则说明已经可以开始学习啦! #### 2. 第一个程序 - Hello World 接下来编写第一个简单的“Hello, World!”示例,在文本编辑器里创建名为`main.go`文件并将下面的内容复制进去保存下来: ```go package main // 指定当前源码所属软件包名称 import "fmt" // 导入标准库中的"fmt",用于格式化I/O操作 func main() { // 主函数入口点 fmt.Println("Hello, world!") } ``` 然后在同一目录下打开终端运行此段代码查看结果: ```bash go run main.go ``` #### 3. 基本数据类型与变量声明 与其他主流编程语言相似地,Go也支持多种基本的数据类型如整数(`int`)、浮点数(`float64`)等;此外还提供了方便快捷的方式来定义新变量: - 使用var关键字显式申明类型; - 或者直接使用短赋值符:=让系统自动推导类型。 例如: ```go // 显式声明 var age int = 25; // 自动推断 name := "张三"; price := 9.78; ``` #### 4. 控制流语句 控制流程包括条件判断(if else)以及循环(for),它们允许开发者根据特定逻辑分支路径或者重复执行某些动作。 比如打印出从0到10之间的所有偶数: ```go for i := 0; i <= 10 ;i++ { if (i % 2 == 0){ fmt.Printf("%d\n", i) } } ``` #### 5. 函数及参数传递 除了内置的标准库外,用户还可以自定义需要的功能模块作为独立单元——即函数。在Go里面每个非匿名函数都必须明确给出返回值列表(即便是void),形参则按位置依次匹配实参与之对应即可. 简单例子:计算两个数字相加的结果. ```go func addNumbers(a float64,b float64)(sum float64){ sum=a+b return sum } result:=addNumbers(3.5 ,4.5); println(result); // 输出8 ``` 这只是对这门强大的工具进行了非常初步简略性的讲解而已哦~如果你感兴趣的话继续深入研究吧!另外还有许多特性等待着大家去探索呢~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值