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. Day 23 类的继承,派生,组合,菱形继承,多态与多态性

    类的继承 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类 继承的特性是:子类会遗传父类的属性 继承是类与类之间的关系 为什么用继承 使用继承可以减少代码的冗余 对象的继承 python中 ...

  2. 玩转python 各种数据类型的转换

    # -*- coding: utf-8 -*- # @Time : 2019/4/28 14:27 # @Author : wujf # @Email : 1028540310@qq.com # @F ...

  3. Labview学习笔记(一)

    一.概述 Labview是一种工业标准图形化编程工具,主要用于开发测试.测量与控制系统,拥有一个可以完成任何编程任务的庞大函数库,包括数据采集.GPIB.串口控制.数据分析.数据显示及数据存储等. L ...

  4. 51nod1242斐波那契数列的第N项 【矩阵快速幂】

    斐波那契数列的定义如下: F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2) (1, 1, 2, 3, 5, 8, 13, 21, 34, ...

  5. [CodeForces1059E] Split the Tree

    树形DP. 用倍增处理出来每个点往上能延伸出去的最远路径,nlogn 对于每个节点,如果它能被后代使用过的点覆盖,就直接覆盖,这个点就不使用,否则就ans++,让传的Max改成dp[x] #inclu ...

  6. Problem 22

    Problem 22 Using names.txt (https://projecteuler.net/problem=22)(right click and 'Save Link/Target A ...

  7. Java基本排序算法

    转载来自:https://www.jianshu.com/p/5e171281a387 一遍记住Java常用的八种排序算法与代码实现   1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已 ...

  8. (29)Spring boot 文件上传(多文件上传)【从零开始学Spring Boot】

    文件上传主要分以下几个步骤: (1)新建maven java project: (2)在pom.xml加入相应依赖: (3)新建一个表单页面(这里使用thymleaf); (4)编写controlle ...

  9. Spring Boot-整合Mybatis(五)

    原始的整合方式 1.添加依赖 <!--mybatis起步依赖--> <dependency> <groupId>org.mybatis.spring.boot< ...

  10. 推荐一个同步Mysql数据到Elasticsearch的工具

    把Mysql的数据同步到Elasticsearch是个很常见的需求,但在Github里找到的同步工具用起来或多或少都有些别扭. 例如:某记录内容为"aaa|bbb|ccc",将其按 ...