go结构,结构嵌套,接口,指针的测试和结论
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结构,结构嵌套,接口,指针的测试和结论的更多相关文章
- 【C++】结构体/结构体数组/结构体指针/结构体嵌套/函数参数/const
一.结构体声明 struct Student { //成员列表 string name; int age; int score; }; //s3;定义时直接声明 int main() { struct ...
- XmlRpc.net 入参结构体嵌套的转义操作
项目使用C#开发,需要使用XmlRpc和Linux服务器端交互,用的是XmlRpc.net. 普通的程序调用入参和出差都没有问题,今天遇到入参结构体嵌套,结果 args 入参在服务器端不能解析.抓包数 ...
- C语言 结构体相关 函数 指针 数组
. 作者 : 万境绝尘 转载请注明出处 : http://www.hanshuliang.com/?post=30 . 结构体概述 : 结构体是 多个 变量的集合, 变量的类型可以不同; -- 可进行 ...
- 11.13的C++##不想写结构,更不爱指针
//2019.11.13 卑微的Loving-Q瞎写的程序 报错请更改VS中的SDL检查// 我要去嗨了,在线卑微 1 #include<iostream> #include<std ...
- 换个语言学一下 Golang (9)——结构体和接口
基本上到这里的时候,就是上了一个台阶了.Go的精华特点即将展开. 结构体定义 上面我们说过Go的指针和C的不同,结构体也是一样的.Go是一门删繁就简的语言,一切令人困惑的特性都必须去掉. 简单来讲,G ...
- 【Golang】Go 通过结构(struct) 实现接口(interface)
一.通过结构(struct) 实现 接口(interface) 1.在了解iris框架的时候,经常看到有这样去写的使用一个空结构体作为接收器,来调用方法,有点好奇这样做有什么意义. 解释:在 Go 语 ...
- 结构体内嵌函数指针实现C语言面向对象
结构体内嵌函数指针 #include<stdio.h> void say(int age) { printf("我%d岁了\n",age); } struct stud ...
- JavascriptS中的各结构的嵌套和函数
各位朋友大家好,上周更新给大家分享了JavaScript的入门知识及各种常用结构的用法,那么,本次更新博主就跟大家更深入的聊一聊JS各结构的嵌套用法,及JS中及其常用的一种结构--函数.以下为函数和循 ...
- Javascript中的各结构的嵌套和函数
各位朋友大家好,上周更新给大家分享了JavaScript的入门知识及各种常用结构的用法,那么,本次更新博主就跟大家更深入的聊一聊JS各结构的嵌套用法,及JS中及其常用的一种结构——函数.以下为函数和循 ...
随机推荐
- 通过fmt标签格式化el表达式中的日期、小数
首先引入fmt外部文件包 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" % ...
- Windows系统SNMP数据监测与OID
Windows系统SNMP数据监测与OID http://blog.csdn.net/liuhuango123/article/details/52253953
- 服务器session,Tomcat有自己的session维护机制,apache有自己的session维护机制
1.SESSION一般不是你说的这种工作方式,你打开一个浏览器,再打开一个,请求同一个网址,然后其中一个登陆,另外一个绝对不会也登陆.SESSION和浏览器本身这个程序就是挂钩的,一般不通过IP和端口 ...
- HDU 4510
省一等,保研. #include <iostream> #include <cstdio> #include <cstring> #include <algo ...
- Android传统HTTP请求get----post方式提交数据(包括乱码问题)
1.模仿登入页面显示(使用传统方式是面向过程的) 使用Apache公司提供的HttpClient API是面向对象的 (文章底部含有源码的连接,包括了使用async框架) (解决中文乱码的问题.主要 ...
- Objective-C学习笔记(二十二)——初始化方法init的重写与自己定义
初学OC.对init这种方法不是非常了解.我们如今来分别对init方法进行重写以及自己定义,来加深对他的了解. 本样例也是用Person类来进行測试. (一)重写init方法. (1)在Person. ...
- linux中O(1)调度算法与全然公平(CFS)调度算法
一.O(1)调度算法 1.1:优先级数组 O(1)算法的:一个核心数据结构即为prio_array结构体. 该结构体中有一个用来表示进程动态优先级的数组queue,它包括了每一种优先级进程所形成的链表 ...
- STM32F4——GPIO基本应用及复用
IO基本应用 一.IO基本结构: 针对STM32F407有7组IO.分别为GPIOA~GPIOG,每组IO有16个IO口,则有112个IO口. 当中IO口的基本结构例如以下: 二.工作方式: ST ...
- APP漏洞自动化扫描专业评测报告(中篇)
前言 上一篇中通过对阿里聚安全[1].360App漏洞扫描[2].腾讯金刚审计系统[3].百度移动云测试中心[4]以及AppRisk Scanner[5] 在收费情况.样本测试后的扫描时间对比和漏洞项 ...
- Linux下叹号!的用法
在定义包含!的字符串变量时,出现了以下提示错误. 注意:在centos系统下错误,在Fedora系统可以正常运行. 修正方法有以下几种: (1)将整个字符串用单引号引起来. (2)在!后添加空格. ( ...