首页 > 其他分享 >Golang入门第四天

Golang入门第四天

时间:2023-02-27 23:23:13浏览次数:41  
标签:string student demo 接口 Golang Person Student 第四天 入门

  1. 面向对象编程
  2. 匿名字段
  3. 匿名字段初始化
  4. 方法
  5. 值语义与引用语义
  6. 封装,继承,多态
  7. 方法值,方法表达式
  8. 接口
  9. 接口继承,接口转换
  10. 空接口
  11. 通过if实现类型断言
  12. 通过switch实现类型断言
package main

import (
	"fmt"
)

// Out 函数
// interface{} 一个空接口,没有方法,可以保存任何值,所有接口都实现自空接口
func Out(data ...interface{}) {
	// 定义一个切片
	i := make([]interface{}, len(data))
	for j, datum := range data {
		i[j] = datum
	}
	for _, value := range data {
		// value , result := value.(int),".()"判断调用参数是不是参数类型,返回两个参数,value是值,result是判断结果
		if value01, result := value.(int); result == true {
			fmt.Printf("这里是一个int : %v", value01)
		} else {
			switch value.(type) {
			case string:
				fmt.Printf("这里是一个string : %v", value)
			case Student:
				fmt.Printf("这里是一个Student : %v", value)
			default:
				fmt.Printf("未知类型: %T , 值: %v", value)
			}
		}
		fmt.Println(value)
	}
}

// Person 匿名字段
type Person struct {
	name string
	sex  byte
	age  int
}

type Student struct {
	Person
	id   int
	addr string
}

var p Person
var s Student
var s1 Student

// DemoStudentV 值语义方法
func (student Student) DemoStudentV() {
	Out("this is demo student")
}

// DemoStudentP 指针语义方法
func (student *Student) DemoStudentP() {
	Out("this is demo student")
}

// DemoPerson 方法,绑定自定义数据类型的函数叫做方法,被绑定的参数会隐式的作为函数的第一个形参传入
func (person Person) DemoPerson() {
	Out(person, "this is demo person")
}

// Inter 接口
type Inter interface {
	Test()
}

// Inter01 接口的继承
type Inter01 interface {
	Inter
	Test01()
}

// Inter02 接口的继承
type Inter02 interface {
	Inter
	Inter01
	Test02()
}

// Test 实现接口
func (penson Person) Test() {
	Out("person 实现了接口 inter")
}

// Test02 重写方法
func (student Student) Test02() {
	Out("student 实现了接口 inter2")
}

func (student Student) Test03() Student {
	Out("student Test03")
	return student
}

func Anyone(inter Inter) {
	inter.Test()
}

func main() {

	// 多态
	func() {
		// 父子接口转换,超集子集转换
		var i Inter
		// 超集可以转化为子集
		i = p
		i.Test()
		i = s
		i.Test()
		// var i2 Inter02
		// 此处赋值失败,因为s缺少inter02的方法实现test01
		// i2 = s
		// i2.Test01()
		// 多态
		Anyone(i)
		Anyone(p)
		// 方法值,调用函数时,无须再传递参数,隐藏了接收者
		iTest := s.Test03
		// 方法表达式,在调用时决定调用参数
		iTest01 := Student.Test03
		iTest01(s)
		// 等价于i.Test()
		Anyone(iTest())
	}()

	// 结构体初始化
	func() {
		s = Student{
			// 匿名字段初始化
			Person: Person{"xiaoming", 'n', 10},
			id:     0,
			addr:   "",
		}
		s2 := Student{
			Person: Person{},
			id:     0,
			addr:   "",
		}
		Out(s, s2)
		s1 = s2
		// 可用值调用引用语义方法,会自动转化为指针调用
		s.DemoStudentP()
		// 同样可用指针调用值语义方法,会自动转化为值调用
		(&s).DemoStudentV()
	}()

	// 继承
	func() {
		// 方法调用
		p.DemoPerson()
		// 方法继承
		s1.DemoPerson()
		// 调用子集方法
		s1.Person.DemoPerson()
		// p1 是一个指针
		p1 := new(Person)
		fmt.Printf("%T\n", p1)
	}()

}
这里是一个string : person 实现了接口 interperson 实现了接口 inter
这里是一个string : person 实现了接口 interperson 实现了接口 inter
这里是一个string : person 实现了接口 interperson 实现了接口 inter
这里是一个string : person 实现了接口 interperson 实现了接口 inter
这里是一个string : student Test03student Test03
这里是一个string : student Test03student Test03
这里是一个string : person 实现了接口 interperson 实现了接口 inter
这里是一个Student : {{xiaoming 110 10} 0 }{{xiaoming 110 10} 0 }
这里是一个Student : {{ 0 0} 0 }{{ 0 0} 0 }
这里是一个string : this is demo studentthis is demo student
这里是一个string : this is demo studentthis is demo student
未知类型: main.Person , 值: %!v(MISSING){ 0 0}
这里是一个string : this is demo personthis is demo person
未知类型: main.Person , 值: %!v(MISSING){ 0 0}
这里是一个string : this is demo personthis is demo person
未知类型: main.Person , 值: %!v(MISSING){ 0 0}
这里是一个string : this is demo personthis is demo person
*main.Person

标签:string,student,demo,接口,Golang,Person,Student,第四天,入门
From: https://www.cnblogs.com/radish40/p/17162349.html

相关文章

  • Go语言入门学习
    一.Go语言介绍Go是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。Go是从2007年末由RobertGriesemer,RobPike,KenThompson主持开发,后来还加入了Ian......
  • golang 实现链表爽不爽?
    犹记得刚学C语言的时候,学到指针这一章,就会有让我们写链表的需求,头插法,尾插法,翻转链表,合并链表,约瑟夫环等等学的不亦乐乎,但是对于指针刚学的时候,真是摸不着脑壳,不知道x......
  • Ansible入门教程
    1、环境准备1.1、准备主机这里使用3台主机做为演示#IP地址:192.168.10.15【控制机】hostnamectlset-hostnameansible-control#IP地址:192.168.10.14hostnamectl......
  • 虚幻引擎5 学习 入门 2Day
    今日的学习内容:灯光渲染灯光分类:DirectionalLight定向光源  PointLight点光源  SpotLight聚光灯 RectLight矩形灯 SkyLight天灯光照分移动性光照......
  • 并发多线程学习(三)Java多线程入门类和接口
    1Thread类和Runnable接口上一章我们了解了操作系统中多线程的基本概念。那么在Java中,我们是如何使用多线程的呢?首先,我们需要有一个“线程”类。JDK提供了Thread类和Runn......
  • K8s:渐进式入门服务网格 Istio (一)
    写在前面分享一些Istio的学习笔记博文内容涉及:istio下载安装一个Demo运行什么是istio,服务网格等概念介绍istio架构组成,应用场景等理解不足小伙伴帮忙指......
  • Vue入门(一)
    Vue基础Vue简介JavaScript框架简化Dom操作响应式数据驱动Vue实例示例:<body><divid="app">{{message}}</div><scriptsrc=......
  • rust入门(4) Trait 生命周期
    避免悬垂引用//这样写会报错fnmain{letr;{letx=5;r=&x;}//`x`droppedherewhilestillborrowedprintln!("ris{......
  • golang入门(十五)断言
    前面的文章提到过,golang是一门强类型的语言。即数据在使用前必须明确标识所属的数据类型。为了让golang中的slice和map可以像Python中的list和dict一样可以存储任意数据。......
  • CTP程序化交易入门系列之一:准备-转
    https://blog.csdn.net/pjjing/article/details/90381795前言:笔者自毕业后一直从事低延时交易系统开发行业,这些年经历过神奇bug,给客户培训,回答客户千奇百怪的问题。在这......