go面向对象

继承 封装 多态

定义结构体

Go 复制代码
//定义老师的结构体
type Teacher struct {
	Name   string
	Age    int
	School string
}

func main() {
	var t1 Teacher
	fmt.Println(t1)
	t1.Name = "tom"
	t1.Age = 20
	t1.School = "school"
	fmt.Println(t1)
}

结构体实例的创建

Go 复制代码
package main

import "fmt"

//定义老师的结构体
type Teacher struct {
	Name   string
	Age    int
	School string
}

func main() {
	var t1 Teacher
	fmt.Println(t1)
	t1.Name = "tom"
	t1.Age = 20
	t1.School = "school"
	fmt.Println(t1)
	var t2 Teacher = Teacher{"liu", 32, "rrr"}
	fmt.Println(t2)
	//指针*
	var t *Teacher = new(Teacher)
	//t是指针 t其实指向的就是地址 应该给这个地址的执行的对象的字段赋值
	(*t).Name = "ma"
	(*t).Age = 23
	t.School = "daxue"
	fmt.Println(t)
	var t6 *Teacher = &Teacher{"sa", 46, "eda"}
	fmt.Println(t6)
}

//指针*

结构值之间的转换

方法 行为

Go 复制代码
package main

import "fmt"

//定义Person结构体
type Person struct {
	Name string
}

func (p Person) test() {
	fmt.Println(p.Name)
}
func main() {
	//创建结构体对象
	var p Person
	p.Name = "tom"
	p.test()
}

改变值

Go 复制代码
package main

import "fmt"

//定义Person结构体
type Person struct {
	Name string
}

func (p Person) test() {
	fmt.Println(p.Name)
}

//*是指针
func (p *Person) test01() {
	fmt.Println()
	fmt.Println((*p).Name)
}
func main() {
	//创建结构体对象
	var p Person
	p.Name = "tom"
	p.test()

	p.Name = "sasa"
	fmt.Printf("p的地址为:%p \n", &p)
	(&p).test()
	fmt.Println(p)
}

改变值用指针

Go 复制代码
package main

import "fmt"

type interger int

func (i interger) print() {
	fmt.Println("i= ", i)
}

func (i *interger) print01() {
	(*i) = 30
	fmt.Println("i=", *i)
}
func main() {
	var i interger = 20
	i.print()
	fmt.Println(i)

	var i01 interger = 5
	i01.print01()
	fmt.Println("i01=", i01)
}

其他包被访问用大写

toString

Go 复制代码
package main

import "fmt"

type Student struct {
	Name string
	Age  int
}

func (s Student) toString() string {
	str := fmt.Sprintf("Name = %v, Age = %v", s.Name, s.Age)
	return str
}
func (s *Student) toString2() string {
	str := fmt.Sprintf("Name = %v, Age = %v", s.Name, s.Age)
	return str
}

func main() {
	stu := Student{
		Name: "tom",
		Age:  20,
	}
	fmt.Println(stu)
	fmt.Println(&stu)
}

方法和函数的区别

Go 复制代码
import "fmt"

type Student struct {
	Name string
}

//定义方法必须定义指定的类型
func (s Student) test01() {
	fmt.Println(s.Name)
}

//定义函数
func method01(s Student) {
	fmt.Println(s.Name)
}
func main() {
	//调用函数
	var s Student = Student{"tom"}
	method01(s)
	//方法调用
	s.test01()
}

函数定义的是指针必须传递的是指针,函数定义的是值传递 必须是值类型

Go 复制代码
package main

import "fmt"

type Student struct {
	Name string
}

//定义函数
func method01(s Student) {
	fmt.Println(s.Name)
}

func method02(s *Student) {
	fmt.Println((*s).Name)
}
func main() {
	//函数定义的是指针必须传递的是指针
	//函数定义的是值传递 必须是值类型
	var s Student = Student{"tom"}
	method01(s)
	method02(&s)
}

对于方法来说,接收者为值类型,可以传入指针类型,接受者为指针类型,可以传入值类型

Go 复制代码
package main

import "fmt"

type Student struct {
	Name string
}

//定义方法
func (s Student) test01() {
	fmt.Println(s.Name)
}
func (s *Student) test02() {
	fmt.Println((*s).Name)
}

func main() {
	var s Student = Student{"yy"}
	s.test01()
	//虽然用指针类型调用,但是传递还是安装值传递的形式
	(&s).test01()

	(&s).test02()
	s.test02()
}

创建结构体实例时指定字段值

返回值的

相关推荐
IT_陈寒2 小时前
Python开发者必知的5大性能陷阱:90%的人都踩过的坑!
前端·人工智能·后端
流浪克拉玛依3 小时前
Go Web 服务限流器实战:从原理到压测验证 --使用 Gin 框架 + Uber Ratelimit / 官方限流器,并通过 Vegeta 进行性能剖析
后端
孟沐3 小时前
保姆级教程:手写三层架构 vs MyBatis-Plus
后端
星浩AI3 小时前
让模型自己写 Skills——从素材到自动生成工作流
人工智能·后端·agent
华仔啊5 小时前
为啥不用 MP 的 saveOrUpdateBatch?MySQL 一条 SQL 批量增改才是最优解
java·后端
武子康6 小时前
大数据-242 离线数仓 - DataX 实战:MySQL 全量/增量导入 HDFS + Hive 分区(离线数仓 ODS
大数据·后端·apache hive
砍材农夫6 小时前
TCP和UDP区别
后端
千寻girling7 小时前
一份不可多得的 《 Django 》 零基础入门教程
后端·python·面试
千寻girling7 小时前
Python 是用来做 AI 人工智能 的 , 不适合开发 Web 网站 | 《Web框架》
人工智能·后端·算法
贾铭7 小时前
如何实现一个网页版的剪映(三)使用fabric.js绘制时间轴
前端·后端