package main

import (
"fmt"
) //T是M1接受者,不是实现M2接受者
//*T是M1接受者,也是M2的接受者
//所以T对象不可以赋值给接口对象。*T可以 //结论:
// 1.结构T实现接口I时,如果想通过方法改变其属性,则需要*T实现I所有方法:
// 2.嵌套结构时,编译器会将子结构的属性和方法拷贝给父结构,与子结构无关系了;
// 3.赋值给接口对象I1,或者接口作为函数参数时,I1:=&T,因为是*T实现了接口I,否则报错
type T struct {
Name string
} func (t T) M1(name string) {
// 值传递,改变副本的值
t.Name = name
}
func (t *T) M2(name string) {
// 结构体指针,修改其本身
t.Name = name
} type Intf interface {
M1(name string)
M2(name string)
} func main() {
fmt.Println(`*****t1 := T{"t1"}`)
t1 := T{"t1"}
fmt.Println("M1之前:", t1.Name)
t1.M1("name1")
fmt.Println("M1之后:", t1.Name)
t1.M2("name2")
fmt.Println("M2之后:", t1.Name) fmt.Println(`*****t2 := &T{"t2"}`)
t2 := &T{"t2"}
fmt.Println("M1之前:", t2.Name)
t2.M1("name1")
fmt.Println("M1之后:", t2.Name)
t2.M2("name2")
fmt.Println("M2之后:", t2.Name) // T does not implement Intf (M2 method has pointer receiver)
// var t3 Intf = t1
var t3 Intf = &t1
t1.Name = "t1"
fmt.Println(`****t3 Intf = &t1`)
fmt.Println("M1之前:", t1.Name)
t3.M1("name1")
fmt.Println("M1之后:", t1.Name)
t3.M2("name2")
fmt.Println("M2之后:", t1.Name) t1.Name = "t0"
fmt.Println("test1 before", t1.Name)
test1(&t1)
fmt.Println("test1 after", t1.Name)
test2(&t1)
fmt.Println("test2 after", t1.Name) // 只有*S实现I,且使用接口作为函数的参数时,需要传递&T,才能改变自身数据 t1.Name = "h1"
test3(t1)
fmt.Println(t1.Name) t1.Name = "h1"
test4(&t1)
fmt.Println(t1.Name) //嵌套类型
// 就是复制一份给新的结构,与原结构无关了
t1.Name = "t1"
type S struct {
T
age int
}
s1 := S{T: t1, age: 12}
fmt.Println(s1.Name, t1.Name)
s1.M1("s1")
fmt.Println(s1.Name, t1.Name)
s1.M2("s2")
fmt.Println(s1.Name, t1.Name) //新结构与接口
var I1 Intf = &s1 } func test1(t Intf) {
t.M1("n1")
}
func test2(t Intf) {
t.M2("n2")
} func test3(t T) {
t.M2("m1")
}
func test4(t *T) {
t.M2("m2")
}

go结构,结构嵌套,接口,指针的测试和结论的更多相关文章

  1. 【C++】结构体/结构体数组/结构体指针/结构体嵌套/函数参数/const

    一.结构体声明 struct Student { //成员列表 string name; int age; int score; }; //s3;定义时直接声明 int main() { struct ...

  2. XmlRpc.net 入参结构体嵌套的转义操作

    项目使用C#开发,需要使用XmlRpc和Linux服务器端交互,用的是XmlRpc.net. 普通的程序调用入参和出差都没有问题,今天遇到入参结构体嵌套,结果 args 入参在服务器端不能解析.抓包数 ...

  3. C语言 结构体相关 函数 指针 数组

    . 作者 : 万境绝尘 转载请注明出处 : http://www.hanshuliang.com/?post=30 . 结构体概述 : 结构体是 多个 变量的集合, 变量的类型可以不同; -- 可进行 ...

  4. 11.13的C++##不想写结构,更不爱指针

    //2019.11.13 卑微的Loving-Q瞎写的程序 报错请更改VS中的SDL检查// 我要去嗨了,在线卑微 1 #include<iostream> #include<std ...

  5. 换个语言学一下 Golang (9)——结构体和接口

    基本上到这里的时候,就是上了一个台阶了.Go的精华特点即将展开. 结构体定义 上面我们说过Go的指针和C的不同,结构体也是一样的.Go是一门删繁就简的语言,一切令人困惑的特性都必须去掉. 简单来讲,G ...

  6. 【Golang】Go 通过结构(struct) 实现接口(interface)

    一.通过结构(struct) 实现 接口(interface) 1.在了解iris框架的时候,经常看到有这样去写的使用一个空结构体作为接收器,来调用方法,有点好奇这样做有什么意义. 解释:在 Go 语 ...

  7. 结构体内嵌函数指针实现C语言面向对象

    结构体内嵌函数指针 #include<stdio.h> void say(int age) { printf("我%d岁了\n",age); } struct stud ...

  8. JavascriptS中的各结构的嵌套和函数

    各位朋友大家好,上周更新给大家分享了JavaScript的入门知识及各种常用结构的用法,那么,本次更新博主就跟大家更深入的聊一聊JS各结构的嵌套用法,及JS中及其常用的一种结构--函数.以下为函数和循 ...

  9. Javascript中的各结构的嵌套和函数

    各位朋友大家好,上周更新给大家分享了JavaScript的入门知识及各种常用结构的用法,那么,本次更新博主就跟大家更深入的聊一聊JS各结构的嵌套用法,及JS中及其常用的一种结构——函数.以下为函数和循 ...

随机推荐

  1. loadrunner报错总结

    1.报错   没有缓存空间可用   TCP超时释放时间?是解决刚才那个报错的? 解决方法如下  修改TcpTimedWaitDelay值为1和MaxUserPort值为65534.最后,重启!  完美 ...

  2. 怎么获取自定义核算项目里某一个类型的数据:做f7

    在BOS里加一个F7字段,关联物料或其他可以选到的基础资料.保存后先别发布    切换到BOS透视图,打到对应的.relation文件,修改supplierEntity,原来是指定物料的实体,改成自定 ...

  3. eas之排序接口

    KDTable目前本身并不支持排序功能,但提供了排序的接口,用户通过实现该接口(ISortManager)即可实现排序的功能.同时KDTable提供了一个简单实现KDTSortManager,这个类完 ...

  4. 使用pandas中的raad_html函数爬取TOP500超级计算机表格数据并保存到csv文件和mysql数据库中

    参考链接:https://www.makcyun.top/web_scraping_withpython2.html #!/usr/bin/env python # -*- coding: utf-8 ...

  5. 爬虫系列(七) requests的基本使用

    一.requests 简介 requests 是一个功能强大.简单易用的 HTTP 请求库,可以使用 pip install requests 命令进行安装 下面我们将会介绍 requests 中常用 ...

  6. node源码详解(三)

    本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource3 本博客同步在https://cnodejs.o ...

  7. [bzoj1218][HNOI2003]激光炸弹_暴力

    激光炸弹 bzoj-1218 HNOI-2003 题目大意:在笛卡尔坐标系上有n个点,问一个平行于坐标轴的r*r的正方形可以最多覆盖多少个目标. 注释:$1\le n \le 10000$,$1\le ...

  8. 不错的题目-n个数连接得到的最大值

    这道题目还是很不错的 <[字符串排序]n个数连接得到最小或最大的多位整数> 题目 描述:设有n个正整数,将它们依次连成在一排,组成一个多位数,现在要求可能组成的多位数中最大的多位数是什么? ...

  9. HDU 3002

    无向图最小割. #include <iostream> #include <cstdio> #include <cstring> using namespace s ...

  10. hive正則表達式

    hive中实现正則表達式,与java中的正則表達式有所差别: 这里经过探索总结了一些: hive中的正则能够用,可是有所差别,差别在于原来的'\' 转义,这里变成了双斜杠了'\\' hive中的正则解 ...