GO语言基础学习------方法_1
来源:互联网 发布:如何注册域名步骤 编辑:程序博客网 时间:2024/05/16 15:18
GO语言基础学习——方法_1
《GO学习笔记》的学习过程中,第五章叫做方法。这是我以前没有接触的概念,百度一下函数在java中叫做方法,函数和方法是一个意思。书中也明确的说方法是一种特殊的函数。这篇研究go语言中的struct,方法与C,C++中struct,重载,析构有什么不同。
1、struct比较
Go语言中似乎似乎没有类的概念,和C一样。C++的class也可以通过struct表示出来,所以3者区别应该很小。先看看内存的分配。
c和c++中内存分配是连续的
#include <stdio.h>typedef struct{ int a; int b; int c;}struct_int;int main(){ struct_int a ={1,2,3}; printf("%d,%d,%d\n",a.a,a.ta.c); return 0;}
由于电脑上的汇编工具debug.exe不能分析go的执行文件。我们可以通过
struct {
int a
int b
}打印a,b的内存地址来看空间是否连续。
结果是两者的内存分配都是连续的。底层两者基本相同。
2、知道内存是连续分配的就可以理解。
•类型 T ⽅方法集包含全部 receiver T ⽅方法。
•类型 *T ⽅方法集包含全部 receiver T + *T ⽅方法。
•如类型 S 包含匿名字段 T,则 S ⽅方法集包含 T ⽅方法。
•如类型 S 包含匿名字段 *T,则 S ⽅方法集包含 T + *T ⽅方法。
•不管嵌⼊入 T 或 *T,*S ⽅方法集总是包含 T + *T ⽅方法。
因为是按空间是连续的,结构体中的结构体,在内存上可以直接看作一个结构体。
package mainimport ( "fmt")type User struct { id int name string}type Manager struct { User}func (self *User) ToString() string { return fmt.Sprintf("User :%p,%v", self, self)}func main() { m := Manager{User{1, "Tom"}} fmt.Printf("Manger: %p\n", &m) fmt.Println(m.ToString())}
这里Manager 结构体中为User结构体叫做匿名字段。其实等价于
struct {
id int
name string
}这就是两者的包含关系
package mainimport ( "fmt")type Data struct { x int}func (self Data) ValueTest() { fmt.Printf("Value: %p\n", &self)}func (self *Data) PointerTest() { fmt.Printf("Pointer: %p\n", self)}func main() { d := Data{} p := &d fmt.Printf("Data &d: %p\n", p) fmt.Printf("Data &p: %p\n", &p) d.ValueTest() //这个代表参数,所以取得的是参数的地址。 d.PointerTest() //代表传入的是指针,取得就是指针的值,所以指针是不变的。对象还是同一个对象,没有创建多个对象。T与*T都可以调用函数。 p.ValueTest() p.PointerTest()}
s以上函数的写法在c,c++中会显得很奇怪。出了参数和返回值,还多了self *Data,self Data,这个可以看作是类中的函数,定义结构体的时候可以调为如果把self *Data/Data看作是参数的话,它应该只支持调用一种形式(valueTest和PointerTest)。
一下是C语言的写法:
#include <iostream>int * p(int *a){ return a;}int * p2(int a){ return &a;}int main(){ int a = 1; printf("%p\n",p(&a)); printf("%p",p2(a)); return 0;}
如果P(a)或者是p2(&a)编译器是会有错误的。
- GO语言基础学习------方法_1
- GO语言基础学习
- go语言基础学习
- Go学习笔记-go语言基础
- go语言基础学习二
- Go语言基础学习:变量
- go语言学习基础简介
- Go 基础语言学习笔记
- Python基础学习_1
- JAVA学习_1基础
- Andoid基础学习_1
- Go语言_基础学习篇
- go语言 基础编程学习笔记
- Go语言学习一 :基础语句
- Go语言基础语法学习笔记[1]
- Go语言基础语法学习笔记[2]
- Go语言基础语法学习笔记[3]
- Go语言基础学习八-映射
- jQuery对象与DOM对象之间的转换
- 10实践项目3.1
- apache虚拟目录配置
- Java中写入文件时换行符用"\r\n"、"\n"、"\r"?
- 【VS开发】TCP服务端如何判断客户端断开连接
- GO语言基础学习------方法_1
- LatinIME中几个主要方法说明======》修改按键背景,以及行列间距
- 文章标题
- 实时传递信息-Websocket
- Android使用键盘控制小飞机的移动
- [ifrog 1066 - Buy Candy] 四边形优化的石子合并
- 递归调用、栈、斐波那契数列
- json格式化网站 超级好用
- IOS 之 UIPickerView 学习总结