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)编译器是会有错误的。

1 0