首页 > 其他分享 >go基本语法总结

go基本语法总结

时间:2022-10-24 11:02:10浏览次数:49  
标签:总结 name int fmt 语法 Println func Printf go

结构体(struct):

  1. 多个父类结构体继承
//父类
type person04 struct {
name string
age int
sex string
}

//父类
type Person04 struct {
id int
addr string
}

//子类
type Student04 struct {
//结构体成员为多个匿名字段
Person04 //匿名字段
person04
score int
}

func main() {
var stu Student04
stu.id = 200
stu.addr = "北京"
stu.name = "王富贵"
stu.age = 10
stu.sex = "男"
stu.score = 100
fmt.Println(stu)

//自动推导类型
s := Student04{Person04{200,"北京"},person04{"王富贵",10,"男"},100}
fmt.Println(s)
}
//爷
type humen struct {
id int
name string
}

//父
type person05 struct {
humen //匿名字段
age int
sex string
}

//子
type student05 struct {
person05 //匿名字段
score int
}

func main() {
var stu student05
stu.name = "亚索"
stu.sex = "男"
stu.score = -5
fmt.Println(stu)

//初始化
//自动推导类型

stu1 := student05{person05{humen{1001,"亚索"},30,"男"},-5}
fmt.Println(stu1)
}
  1. 定义结构体方法(可普通,可指针)
type cat struct {
name string
age int
}

type dog struct {
name string
age int
}

//函数定义

//func 函数名 (参数列表) 返回值列表 {
// 代码体
//}

func show() {
fmt.Println("喵喵叫")
}
//方法定义
//func (对象)方法 (参数列表) 返回值列表 {
// 代码体
//}


//方法

//结构体类型 可以作为对象类型
//结构体作为接收者
func (c cat)show() {
fmt.Println("喵喵叫")
fmt.Printf("我是%s,喵喵叫\n",c.name)
}

//方法名一样 接受者不一样 方法也就不一样
func (d *dog)show() {
fmt.Println("汪汪叫")
}


func main() {
//对象创建
var c cat

c.name = "小花"
c.age = 2
fmt.Println(c)
//对象.方法 包.函数 结构体.成员
c.show()

//函数调用
//show()


var d dog
d.name = "旺财"
d.age = 3
fmt.Println(d)
d.show()


//对象的方法名和函数名可以 重名 但是 相同的对象方法不能重名
//show()


}
  1. 子类可以调用父类的方法
//父类
type person08 struct {
id int
name string
age int
}

//子类
type student08 struct {
person08 //匿名字段
class int
}
// 建议 使用指针类型
func (p *person08)PrintInfo() {
fmt.Printf("编号%d\n",p.id)
fmt.Printf("姓名%s\n",p.name)
fmt.Printf("年纪%d\n",p.age)
}

func main() {
p := person08{110,"德玛",30}
p.PrintInfo()
//子类可以继承父类 可以继承属性 和 方法
//父类不能继承子类 属性 方法
s := student08{person08{120,"德邦",15},9}

s.PrintInfo()
}
  1. 子类可以重构父类的方法,并且父类和子类的方法都可以保留下来,具体要看看是什么调用
type person09 struct {
id int
name string
age int
}

// 建议 使用指针类型
func (p *person09) PrintInfo() {
fmt.Printf("编号%d\n", p.id)
fmt.Printf("姓名%s\n", p.name)
fmt.Printf("年纪%d\n", p.age)
}

//子类
type student09 struct {
person09 //匿名字段
class int
}

func (s *student09) PrintInfo() {
fmt.Println("Student:", *s)
}
func main() {
s := student09{person09{130, "小刚", 18}, 10}
//子类对象方法 采用就近原则 使用子类的方法
//方法重写
s.PrintInfo()

//父类对象方法
s.person09.PrintInfo()
fmt.Println(s.PrintInfo)
fmt.Println(s.person09.PrintInfo)
}
  1. 方法可以赋值一个变量,然后让变量执行,达到隐藏结构体调用方法的效果
type person10 struct {
id int
name string
age int
}

func (p person10) PrintInfo1() {
fmt.Printf("info1%p, %v\n", &p, p)
}

//建议使用
func (p *person10) PrintInfo2() {
fmt.Printf("info2%p, %v\n", p, *p)
}

func main() {

p := person10{1, "make", 22}
//p.PrintInfo1() //0xc042002400, {1 make 22}
//p.PrintInfo2() //0xc0420023e0, {1 make 22}

//fmt.Println(p.PrintInfo1)
//fmt.Println(p.PrintInfo2)
//
//fmt.Printf("%T\n",p.PrintInfo1)
//fmt.Printf("%T\n",p.PrintInfo2)

//方法值 隐式传递 隐藏的是接受者 绑定实例(对象)
//var pfunc1 func()
//对象相同 但是函数类型不同 不能赋值
//函数类型相同 可以赋值
pfunc1 := p.PrintInfo1
pfunc1 = p.PrintInfo2
pfunc1() // == p.PrintInfo1
fmt.Printf("%T\n", pfunc1)

//方法表达式 显式传参

//pfunc1 := person10.PrintInfo1
//pfunc1(p)
//pfunc2 := (*person10).PrintInfo2
//pfunc2(&p)
//
//
//fmt.Printf("%T\n",pfunc1)
//fmt.Printf("%T\n",pfunc2)

接口(interface):

  1. 接口不在结构体内创建,是单独的一种类型
//先定义接口  一般以er结尾  根据接口实现功能
type Humaner interface {
//方法 方法的声明
sayhi()

}


type student11 struct {
name string
age int
score int
}

func (s *student11)sayhi() {
fmt.Printf("大家好,我是%s,今年%d岁,我的成绩%d分\n",s.name,s.age,s.score)
}

type teacher11 struct {
name string
age int
subject string
}

func (t *teacher11)sayhi() {
fmt.Printf("大家好,我是%s,今年%d岁,我的学科是%s\n",t.name,t.age,t.subject)
}




func main() {
//接口是一种数据类型 可以接收满足对象的信息
//接口是虚的 方法是实的
//接口定义规则 方法实现规则
//接口定义的规则 在方法中必须有定义的实现
var h Humaner

stu := student11{"小明",18,98}
//stu.sayhi()
//将对象信息赋值给接口类型变量
h = &stu
h.sayhi()

tea := teacher11{"老王",28,"物理"}
//tea.sayhi()
//将对象赋值给接口 必须满足接口中的方法的声明格式
h = &tea
h.sayhi()
}
  1. 接口可以作为参数放入方法里,从而实现多态
//先定义接口  一般以er结尾  根据接口实现功能
type Humaner1 interface {
//方法 方法的声明
sayhi()

}


type student12 struct {
name string
age int
score int
}

func (s *student12)sayhi() {
fmt.Printf("大家好,我是%s,今年%d岁,我的成绩%d分\n",s.name,s.age,s.score)
}

type teacher12 struct {
name string
age int
subject string
}

func (t *teacher12)sayhi() {
fmt.Printf("大家好,我是%s,今年%d岁,我的学科是%s\n",t.name,t.age,t.subject)
}

//多态的实现
//将接口作为函数参数 实现多态
func sayhello(h Humaner1) {
h.sayhi()
}

func main() {

stu := student12{"小明",18,98}
//调用多态函数
sayhello(&stu)

tea := teacher12{"老王",28,"Go"}
sayhello(&tea)
}
  1. 子接口可以给父接口赋值,反之不行(因为子接口实现的方法多,方法只能多不能少)
//先定义接口  一般以er结尾  根据接口实现功能
type Humaner2 interface { //子集
//方法 方法的声明
sayhi()

}

type Personer interface { //超集
Humaner2 //继承sayhi()

sing(string)
}

type student13 struct {
name string
age int
score int
}

func (s *student13)sayhi() {
fmt.Printf("大家好,我是%s,今年%d岁,我的成绩%d分\n",s.name,s.age,s.score)
}

func (s *student13)sing(name string) {
fmt.Println("我为大家唱首歌",name)
}

func main1301() {
//接口类型变量定义
var h Humaner2
var stu student13 = student13{"小吴",18,59}
h = &stu
h.sayhi()

//接口类型变量定义
var p Personer
p = &stu
p.sayhi()
p.sing("大碗面")
}

func main() {
//接口类型变量定义
var h Humaner2 //子集
var p Personer //超集
var stu student13 = student13{"小吴",18,59}

p = &stu
//将一个接口赋值给另一个接口
//超集中包含所有子集的方法
h = p //ok

h.sayhi()

//子集不包含超集
//不能将子集赋值给超集
//p = h //err
//p.sayhi()
//p.sing("大碗面")
  1. 如果用空接口作为变量类型,则该变量可以定义且接收任何类型(包括方法);如果是数组或者切片,也可以放入不通类型的数据
func main1401() {

var i interface{}
//接口类型可以接收任意类型的数据
//fmt.Println(i)
fmt.Printf("%T\n",i)
i = 10
fmt.Println(i)
fmt.Printf("%T\n",i)

i = 3.14
fmt.Println(i)
fmt.Printf("%T\n",i)

i = "Go"
fmt.Println(i)
fmt.Printf("%T\n",i)

fmt.Println("aaa",11,3.14,'a')

}

func test14(){
fmt.Println("test14")
}

func main() {
//空接口类型的切片
var i []interface{}
fmt.Printf("%T\n",i)
i = append(i,10,3.14,"aaa",test14)

fmt.Println(i)
for idx:=0; idx<len(i) ;idx++ {
fmt.Println(i[idx])

}
}

go基本语法总结_子类

 



标签:总结,name,int,fmt,语法,Println,func,Printf,go
From: https://blog.51cto.com/u_12286670/5788872

相关文章

  • JavaScript语法注释&数据类型和JavaScript语法变量
    JavaScript语法注释&数据类型注释:1.单行注释://注释内容2.多行注释:/*注释内容*/数据类型:1.原始数据类型(基本数据类型)1.number:数字。整数/小数/NaN(not......
  • 608 Javascript_语法_—元运算符 and 609 Javascript_语法_算数&比较运算符
    Javascript_语法_—元运算符一元运算符:只有一个运算数的运算符       ++,--,+(正号),-(符号)       ++(--),自增,自减           ++(--)先自增或......
  • 【Python基础学习】第十三节 异常操作总结
    Python基础学习之异常操作总结在Python运行遇到异常时,程序会终止;而在我们编程过程中,错误是不可避免的,这时我们需要捕捉到异常,还需要程序继续运行;这时我们就需要根据异常Tra......
  • Oracle数据库在语法上与MySQL的不同点
    0.不区分大小写Oracle数据库是不区分大小写的1.分页查询实现MySQL分页查询的实现是使用limit关键词,但是在Oracle中没有limit这个关键词,取而代之的是rownum,用法如下:se......
  • 2022年10月电赛经验总结
    电赛经验总结2022年10月13日--18日,参加了为期六天的上海市大学生电子设计竞赛,选题为B题——具有自动泊车功能的电动小车,成绩为市二等奖,不尽如人意。在此简单总结一下比赛......
  • JavaScript发展史和JavaScript语法与html结合方式
    JavaScript发展史JavaScript发展史:1.1992年,Nombase公司,开发出第一门客户端脚本语言,专门用于表单的校验。命名为:C--,后来更名为:ScriptEase2.1995年,Netscape(网景)......
  • 个人摸底测试总结(第二天)
    01,如何将下面的代码改得更有语义化?<div><h1>这是一个标题</h2><p>这是一个文字</p><ul><li>列表一</li><li>......
  • 2022-2023-1 20221317《计算机基础与程序设计》第九周学习总结
    作业信息这个作业属于哪个课程:首页-2022-2023-1-计算机基础与程序设计-北京电子科技学院-班级博客-博客园(cnblogs.com)这个作业的要求在:2022-2023-1《计算......
  • go柳叶刀工具集合
    lancet是一个全面、高效、可复用的go语言工具函数库。本次发布v2.0.0版本,全面升级go1.18,应用泛型重写大部分函数。同时新增70+函数。特性全面、高效、可复用250+常用go......
  • 给 hugo 博客添加搜索功能
    起因我的博客使用了hugo作为静态生成工具,自带的主题里也没有附带搜索功能。看来,还是得自己给博客添加一个搜索功能。经过多方查找,从HugoFastSearch·GitHub找到......