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. PAT_A1134#Vertex Cover

    Source: PAT A1134 Vertex Cover (25 分) Description: A vertex cover of a graph is a set of vertices su ...

  2. linux下关闭键盘的重复击键

    https://askubuntu.com/questions/576421/disable-keyboard-repeat-from-command-line You can use the xse ...

  3. windows 禁用 magic mouse2 左右移动

    相信大部分程序员同志,只要用macbook都回装双系统的,本人也不例外,因为需要用到vs等很多开发工具. magic mouse2在osx上的表现本人不做评论,没用过几回,在win10上的表现太差劲了 ...

  4. BZOJ 1179 抢掠计划atm (缩点+有向无环图DP)

    手动博客搬家: 本文发表于20170716 10:58:18, 原地址https://blog.csdn.net/suncongbo/article/details/81061601 https:// ...

  5. 【学习笔记】有向无环图上的DP

    手动博客搬家: 本文发表于20180716 10:49:04, 原地址https://blog.csdn.net/suncongbo/article/details/81061378 首先,感谢以下几 ...

  6. LaTeX的简单使用方法

    先来一个总结得比较好的https://blog.csdn.net/garfielder007/article/details/51646604 1.普通公式 $公式不换行$ $公式不换行$ $$公式独 ...

  7. 0808关于RDS如何恢复到本地教程

    转自http://www.cnblogs.com/ilanni/archive/2016/02/25/5218129.html 公司目前使用的数据库是阿里云的RDS,目前RDS的版本为mysql5.6 ...

  8. ExpressionTreeVisualizer

    看表达式的工具,这个工具后来微软不更新了,只支持到VS2013 表达式树的语法难度太大,语法和实现难度都大 相关文章 github地址

  9. 使用ZooKeeper实现配置同步(转)

    前言 应用项目中都会有一些配置信息,这些配置信息数据量少,一般会保存到内存.文件或者数据库,有时候需要动态更新.当需要在多个应用服务器中修改这些配置文件时,需要做到快速.简单.不停止应用服务器的方式修 ...

  10. Extensions for Spatial Data

    http://dev.mysql.com/worklog/task/?spm=5176.100239.blogcont4270.8.j3asa7&id=6609 前文: 这两天因为项目原因看了 ...