先来一个返回指针的测试,结果跟想象一样

type A map[int]string
type B struct {
A
c int
} func main() {
b := B{make(A), 10}
NewB := func() *B {
return &b
}
c := NewB()
c.c = 100
c.A[1] = "3"
fmt.Println(b, c)
}
/* output
{map[1:3] 100} &{map[1:3] 100}
*/

再试试直接返回值,这下的输出和想象中不一样了

type A map[int]string
type B struct {
A
c int
} func main() {
a := B{make(A), 10}
b := B{make(A), 10}
NewB := func() B {
return b
}
c := NewB()
c.c = 100
c.A[1] = "3"
// c[1]="3" invalid operation: c[1] (type B does not support indexing)
fmt.Println(a, b, c)
}
/* output
{map[] 10} {map[1:3] 10} {map[1:3] 100}
*/

为什么呢,再试试


type A map[int]string
type B struct {
A
c int
} func main() {
a := make(A)
NewA := func() A {
return a
}
b := NewA()
b[1] = "10"
fmt.Println(a, b)
}
/* output
map[1:10] map[1:10]
*/
这样就编译不过了
func main() {
a := make(A)
NewA := func() *A {
return &a
}
b := NewA()
b[1] = "10" //invalid operation: b[1] (type *A does not support indexing)
fmt.Println(a, b)
}

go 语言中map,slice都是指针类型,以值的形式返回struct的时候只是把map对应的指针拷贝了

Go语言学习记录之一(返回指针与返回值的区别)的更多相关文章

  1. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

  2. ElasticSearch 学习记录之Text keyword 两种基本类型区别

    ElasticSearch 系列文章 1 ES 入门之一 安装ElasticSearcha 2 ES 记录之如何创建一个索引映射 3 ElasticSearch 学习记录之Text keyword 两 ...

  3. C语言学习记录_2019.02.23

    char类型的输出: scanf("%d",&i);//i=49; char x=i; printf("x=%d\n",x); printf(" ...

  4. 吴裕雄--天生自然C++语言学习笔记:C++ 指针

    每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址. #include <iostream> using namesp ...

  5. C语言学习笔记之函数指针与函数指针数组

    指针函数:本质是一个函数: 是一个返回指针类型的函数int * sum(){ } 函数指针:本质是一个指针: 是一个指向函数的指针 int (*p)(int,int) = sum; p(5,6); i ...

  6. C语言学习笔记 (001) - 常量指针与指针常量的区别(转帖)

    三个名词虽然非常绕嘴,不过说的非常准确.用中国话的语义分析就可以很方便地把三个概念区分开. 一) 常量指针. 常量是形容词,指针是名词,以指针为中心的一个偏正结构短语.这样看,常量指针本质是指针,常量 ...

  7. C语言学习记录_2019.02.12

    "学计算机一定要有一个非常强大的心理状态,计算机不是黑魔法,都是人想出来的,别人能够想的出来,那么,总有一天,我也能够想的出来." 指针类型的变量就是保存地址的变量. int* p ...

  8. 学习iOS笔记第一天的C语言学习记录

    c语言基础学习 int num1 = 15; int num2 = 5; int temp = 0; //先把num1放到temp里 temp = num1; //先把num2放到num1里 num1 ...

  9. C语言学习记录_2019.02.10

    sizeof:给出某个类型或某个变量在内存中占据的字节数:(1个字节8位,即8比特) 格式符 (1)%ld表示数据按十进制有符号长型整数输入或输出. (2)%d表示数据按十进制有符号整型数输入或输出. ...

随机推荐

  1. css 动画的例子

    1. [代码]   <!DOCTYPE HTML><html><head><meta charset="utf-8"><tit ...

  2. jsp学习(3)

    1.model模式 2.model1.x分层模式 3.mvc模式(model2) model2的具体体现就是mvc. dao:就是data access object数据访问对象,即专门对数据库进行操 ...

  3. spring mongodb 复制集配置(实现读写分离)

    注:mongodb当前版本是3.4.3   spring连接mongodb复制集的字符串格式: mongodb://[username:password@]host1[:port1][,host2[: ...

  4. C#实现文件拖放并打开文件(使用ListBox)

    1.C#实现文件拖放并打开文件 (http://www.cnblogs.com/GaoHuhu/archive/2012/10/10/2717954.html)

  5. django admin扩展user表password验证及set_password

    一般如果扩展了django user内置表,在admin后台创建新用户的时候密码将会变成明文,故而导致登录不成功.所以我们在admin.py可以通过form自定义进行对password进行操作,可以双 ...

  6. python基础-变量

    1.什么是变量? 其实就是给数据起个名字而已.在python中你不想要关心数据类型,因为在你赋值的时候它已经自己帮你识别了 2.创建变量时候会在内存中开辟一个空间,具体的细节不需要咱们关心,解释器会分 ...

  7. xml字符串转xml对象,xml对象转json对象

    xml字符串转xml对象: function loadXml(str) { if (str == null) { return null; } var doc = str; try{ doc = cr ...

  8. Xposed模块开发学习记录

    Xposed模块相关API可以参考在线文档: https://api.xposed.info/reference/packages.html     入门教程可以参考: https://github. ...

  9. Metasploit的使用下篇——漏洞攻击

    一.上文总结 上篇当中主要通过开启的端口对目标主机进行攻击,最后成功做到了连接不过却不能查看到telnet的登陆用户名和密码,目前来看有两个原因:第一.我对于靶机telnet的设置有问题,没有设置相应 ...

  10. 2017-2018-1 20179203 《Linux内核原理与分析》第三周作业

    攥写人:李鹏举 学号:20179203 ( 原创作品转载请注明出处) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/US ...