golang面向对象编程(代码片段)

知其黑、受其白 知其黑、受其白     2023-04-03     581

关键词:

阅读目录

Golang 面向对象编程1

1 struct 声明和定义

1、Go中面向对象是通过 struct 来实现的,struct 是用户自定义的类型。

type User struct 
	Username string
	Sex      string
	Age      int
	AvatarUrl string

注意:type 是用来定义一种类型。

struct 初始化方法 1

var user User
user.Age = 18
user.Username = "user01"
user.Sex = "男"
user.AvatarUrl = "http://my.com/xxx.png"

注意:使用变量名+‘.’+字段名访问结构体中的字段。

package main

import "fmt"

type User struct 
	Username  string
	Sex       string
	Age       int
	AvatarUrl string


func main() 
	var user User
	user.Age = 18
	user.Username = "user01"
	user.Sex = "男"
	user.AvatarUrl = "http://my.com/xxx.png"
	fmt.Printf("user.username=%s age=%d sex%s avatar=%s\\n", user.Username, user.Age, user.Sex, user.AvatarUrl)

PS E:\\TEXT\\test_go\\one> go run .\\test1.go
user.username=user01 age=18 sex男 avatar=http://my.com/xxx.png
PS E:\\TEXT\\test_go\\one>

struct 初始化方法 2

package main

import "fmt"

type User struct 
	Username  string
	Sex       string
	Age       int
	AvatarUrl string


func main() 
	// 注意也可以部分初始化
	var user User = User
		Username:  "user01",
		Sex:       "男",
		Age:       18,
		AvatarUrl: "http://my.com/xxx.png",
	
	fmt.Printf("user.username=%s age=%d sex%s avatar=%s\\n", user.Username, user.Age, user.Sex, user.AvatarUrl)

	// 更简单的写法
	user1 := User
		Username: "user01",
		// 未初始化的字段就是默认值空或零
		// Sex:       "男",
		// Age:       18,
		AvatarUrl: "http://my.com/xxx.png",
	
	fmt.Println(user1)


PS E:\\TEXT\\test_go\\one> go run .\\test1.go
user.username=user01 age=18 sex男 avatar=http://my.com/xxx.png
user01  0 http://my.com/xxx.png
PS E:\\TEXT\\test_go\\one>

未初始化的结构体:

var user3 User
fmt.Printf("user3=%#v\\n", user3)
PS E:\\TEXT\\test_go\\one> go run .\\test1.go
user3=main.UserUsername:"", Sex:"", Age:0, AvatarUrl:""
PS E:\\TEXT\\test_go\\one>

结构体类型指针

package main

import "fmt"

type User struct 
	Username  string
	Sex       string
	Age       int
	AvatarUrl string


func main() 
	// 结构体类型指针
	var user *User = &User
	fmt.Printf("%p %#v\\n", user, user)


PS E:\\TEXT\\test_go\\one> go run .\\test1.go
0xc000026080 &main.UserUsername:"", Sex:"", Age:0, AvatarUrl:""
PS E:\\TEXT\\test_go\\one>

注意:&User 和 new(User) 本质上是一样的,都是返回一个结构体的地址。

package main

import "fmt"

type User struct 
	Username  string
	Sex       string
	Age       int
	AvatarUrl string


func main() 
	// 结构体类型指针
	// var user *User = &User
	// fmt.Printf("%p %#v\\n", user, user)
	// 0xc000026080 &main.UserUsername:"", Sex:"", Age:0, AvatarUrl:""

	var user *User = &User
		Username:  "user01",
		Sex:       "男",
		AvatarUrl: "http://my.com/xxx.png",
	
	// 这种写法是 go 的语法糖
	user.Age = 18
	// 相当于 go 内部的这种写法
	(*user).Username = "user001"
	fmt.Printf("user01=%#v\\n", user)
	// user01=&main.UserUsername:"user001", Sex:"男", Age:18, AvatarUrl:"http://my.com/xxx.png"

	test()


func test() 
	var user1 *User = new(User)
	user1.Age = 18
	fmt.Println(user1)
	// &  18 

2 struct 的内存布局及构造函数

结构体内存布局:占用一段连续的内存空间。

package main

import "fmt"

type Test struct 
	A int32
	B int32
	C int32
	D int32


func main() 
	var t Test
	fmt.Printf("a addr:%p\\n", &t.A)
	fmt.Printf("b addr:%p\\n", &t.B)
	fmt.Printf("c addr:%p\\n", &t.C)
	fmt.Printf("d addr:%p\\n", &t.D)

一个字符占四个字节,地址是16进制所以打印出的结果是连续的。

PS E:\\TEXT\\test_go\\one> go run .\\test1.go
a addr:0xc00000e0d0
b addr:0xc00000e0d4
c addr:0xc00000e0d8
d addr:0xc00000e0dc
PS E:\\TEXT\\test_go\\one>

结构体没有构造函数,必要时需要自己实现

自定义包:E:\\TEXT\\test_go\\one\\user\\user.go

package user

type User struct 
	Username  string
	Sex       string
	Age       int
	AvatarUrl string

自定义执行文件:E:\\TEXT\\test_go\\one\\user_test\\test.go

package main

import (
	"fmt"
	"one/user"
)

func main() 
	// 使用第三方类型定义了一个变量
	var users user.User
	users.Age = 33
	fmt.Printf("user=%#v\\n", users)

PS E:\\TEXT\\test_go\\one\\user_test> go run .\\test.go
user=user.UserUsername:"", Sex:"", Age:33, AvatarUrl:""
PS E:\\TEXT\\test_go\\one\\user_test>

编写构造函数:

E:\\TEXT\\test_go\\one\\user\\user.go

package user

type User struct 
	Username  string
	Sex       string
	Age       int
	AvatarUrl string


// 构造函数
func NewUser(username string, sex string, age int, avatar string) *User 
	// 第一种方式
	// user := &User
	// 	Username:  username,
	// 	Sex:       sex,
	// 	Age:       age,
	// 	AvatarUrl: avatar,
	// 
	user := new(User)
	user.Username = username
	user.Sex = sex
	user.Age = age
	user.AvatarUrl = avatar
	return user

初始化构造函数:

E:\\TEXT\\test_go\\one\\user_test\\test.go

package main

import (
	"fmt"
	"one/user"
)

func main() 
	u := user.NewUser("user01", "女", 33, "xx.jpg")
	fmt.Printf("user=%#v\\n", u)

PS E:\\TEXT\\test_go\\one\\user_test> go run .\\test.go
user=&user.UserUsername:"user01", Sex:"女", Age:33, AvatarUrl:"xx.jpg"
PS E:\\TEXT\\test_go\\one\\user_test>

匿名字段和嵌套

匿名字段:即没有名字的字段。

注意:匿名字段默认采用类型名作为字段名。

package main

import "fmt"

type User struct 
	Username  string
	Sex       string
	Age       int
	AvatarUrl string
	int
	string


func main() 
	var user User
	user.Username = "user001"
	user.Sex = "nv"
	user.int = 100
	user.string = "hello"

	fmt.Printf("user=%#v\\n", user)

PS E:\\TEXT\\test_go\\one> go run .\\test1.go
user=main.UserUsername:"user001", Sex:"nv", Age:0, AvatarUrl:"", int:100, string:"hello"
PS E:\\TEXT\\test_go\\one>

3 匿名字段和 struct 嵌套

package main

import "fmt"

type Address struct 
	Province string
	City     string


type User struct 
	Username string
	Sex      string
	address  Address


func main() 
	user := &User
		Username: "user01",
		Sex:      "nv",
		address: Address
			Province: "beijing",
			City:     "beijing",
		,
	

	fmt.Printf("user=%#v\\n", user)

PS E:\\TEXT\\test_go\\one> go run .\\test1.go
user=&main.UserUsername:"user01", Sex:"nv", address:main.AddressProvince:"beijing", City:"beijing"
PS E:\\TEXT\\test_go\\one>

指针方式

package main

import "fmt"

type Address struct 
	Province string
	City     string


type User struct 
	Username string
	Sex      string
	address  *Address


func main() 
	user := &User
		Username: "user01",
		Sex:      "nv",
		address: &Address
			Province: "beijing",
			City:     "beijing",
		,
	

	fmt.Printf("user=%#v\\n", user)

匿名结构体

package main

import "fmt"

type Address struct 
	Province string
	City     string


type User struct 
	Username string
	Sex      string
	*Address


func main() 
	var user User
	user.Username = "user0011"
	user.Sex = "nv"

	// 第一种方式
	user.Address = &Address
		Province: "bj",
		City:     "chengshi",
	

	// 第二种方式
	user.Province = "上海"
	user.City = "shanghai"
	
	// user 结构体中没有city去匿名结构体找city
	fmt.Printf("user=%#v addr=%#v city:%s\\n", user, user.Address, user.City)

PS E:\\TEXT\\test_go\\one> go run .\\test1.go
user=main.UserUsername:"user0011", Sex:"nv", Address:(*main.Address)(0xc0000523c0) addr=&main.AddressProvince:"上海", City:"shanghai"
PS E:\\TEXT\\test_go\\one>

匿名结构体冲突解决

冲突指定字段的名字即可解决。

package main

import "fmt"

type Address struct 
	Province string
	City     string


type User struct 
	Username string
	Sex      string
	City     string
	*Address


func main() 
	var user User
	user.Username = "user001"
	user.Sex = "nv"
	user.City = "beijing"

	fmt.Printf("user=%#v\\n", user)

	user.Address = new(Address)
	user.Address.City = "上海"
	fmt.Printf("user=%#v city of address:%s\\n", user, user.Address.City)


PS E:\\TEXT\\test_go\\one> go run .\\test1.go
user=main.UserUsername:"user001", Sex:"nv", City:"beijing", Address:(*main.Address)(nil)
user=main.UserUsername:"user001", Sex:"nv", City:"beijing", Address:(*main.Address)(0xc0000523e0) city of address:上海
PS E:\\TEXT\\test_go\\one
package main

import "fmt"

type Address struct 
	Province   string
	City       string
	CreateTime string

type Email struct 
	Account    string
	CreateTime string


type User struct 
	Username string
	Sex      string
	City     string
	*Address
	*Email


func main() 
	var user User
	user.Username = "user001"
	user.Sex = "nv"
	user.City = "beijing"
	user.Address = new(Address)
	user.Email = new(Email)
	user.Address.City = "上海"
	user.Email.CreateTime = "email_createtime"
	fmt.Printf("user=%#v createtime:%s\\n", user, user.Email.CreateTime)

PS E:\\TEXT\\test_go\\one> go run .\\test1.go
user=main.UserUsername:"user001", Sex:"nv", City:"beijing", Address:(*main.Address)(0xc0001004b0), Email:(*main.Email)(0xc0000523c0) createtime:email_createtime
PS E:\\TEXT\\test_go\\one>

4 struct 与 tag 应用

字段可见性,大写表示可公开访问,小写表示私有。

tag 是结构体的元信息,可以在运行的时候通过反射机制读取出来

字段类型后面,以反引号括起来的 key-value 结构的字符串,多个tag已逗号隔开。

package main

import (
	"encoding/json"
	"fmt"
)

// 双引号表示 value
type User struct 
	Username   string `json:"username",db:"user_name"`
	Sex        string `json:"sex"`
	Age        int    `json:"age"`
	avatarUrl  string
	CreateTime string


func main() 
	user := &User
		Username:   "user001",
		Sex:        "女",
		Age:        33,
		avatarUrl:  "https://my.com/xx.png",
		CreateTime: "2022-30-51",
	
	// json 序列化后是json格式,返回的是字符切片
	data, _ := json.Marshal(user)
	fmt.Printf("json str:%s\\n", string(data))

PS E:\\TEXT\\test_go\\one> go run .\\test1.go
json str:"username":"user001","sex":"女","age":33,"CreateTime":"2022-30-51"
PS E:\\TEXT\\test_go\\one>

5 函数方式实现一个简单的学生管理系统

实现一个简单的学生管理系统,每个学生有分数、年级、性别、名字等字段,用户可以在控制台添加学生、修改学生信息、打印所有学生列表的功能。

E:\\TEXT\\test_go\\one\\test1.go

package main

import (
	"fmt"
	"one/student"
	"os"
)

var (
	AllStudents []*student.Student
)

func showMenu() 
	fmt.Println("1、add student")
	fmt.Println("2、modify student")
	fmt.Println("3、show all student")
	fmt.Println("4、exited\\n\\n")


func inputStudent() *student.Student 
	var (
		username string
		sex      int
		grade    string
		score    float32
	)
	fmt.Println("please input username:")
	fmt.Scanf("%s\\n", &username)

	fmt.Println("please input sex:[0|1]")
	fmt.Scanf("%d\\n", &sex)

	fmt.Println("please input grade:[0-6]")
	fmt.Scanf("%s\\n", &grade)

	fmt.Println("please input score:[0|100]")
	fmt.Scanf("%f\\n", &score)

	stu := student.NewStudent(username, sex, score, grade)
	return stu


func AddStudent() 
	stu := inputStudent()
	for index, v := range AllStudents 
		if v.Username == stu.Username 
			fmt.Printf("user %s success update\\n\\n", stu.Username)
			AllStudents[index] = stu
			return
		
	

	AllStudents = append(AllStudents, stu)
	fmt.Printf("user %s success insert\\n", stu.Username)


func ModifyStudent() 
	stu := inputStudent()
	for index, v := range AllStudents 
		if v.Username == stu.Username 
			AllStudents[index] = stu
			fmt.Printf("user %s success update\\n\\n", stu.Username)
			return
		
	
	fmt.Printf("user %s is not fund\\n", stu.Username)


func ShowAllStudent() 
	for _, v := range AllStudents 
		fmt.Printf("user:%s info:%#v\\n", v.Username, v)
	


func main() 
	for 
		showMenu()
		var sel int
		fmt.Scanf("%d\\n", &sel)

		switch sel 
		case 1:
			AddStudent()
		case 2:
			ModifyStudent()
		case 3:
			ShowAllStudent()
		case 4:
			os.Exit(0)
		
	

PS E:\\TEXT\\test_go\\one> go run .\\test1.go
1、add student
2、modify student
3、show all student
4、exited


1
please input username:
wgchen
please input sex:[0|1]
1
please input grade:[0-6]
5
please input score:[0|100]
99
user wgchen success insert
1、add student
2、modify student
3、show all student
4、exited


1
please input username:
xiaojun
please input sex:[0|1]
1
please input grade:[0-6]
1
please input score:[0|100]
88
user xiaojun success insert
1、add student
2、modify student
3、show all student
4、exited


1
please input username:
ycc
please input sex:[0|1]
0
please input grade:[0-6]
6
please input score:[0|100]
100
user ycc success insert
1、add student
2、modify student
3、show all student
4、exited


3
user:wgchen info:&student.StudentUsername:"wgchen", Score:99, Grade:"5", Sex:1
user:xiaojun info:&student.StudentUsername:"xiaojun", Score:88, Grade:"1", Sex:1
user:ycc info:&student.StudentUsername:"ycc", Score:100, Grade:"6", Sex:0
1、add student
2、modify student
3、show all student
4、exited


4
PS E:\\TEXT\\test_go\\one>

E:\\TEXT\\test_go\\one\\student\\student.go

package student

type Student struct 
	Username string
	Score    float32
	Grade    string
	Sex      int


func NewStudent(username string, sex int, score float32, grade string) (stu *Student) 
	stu = &Student
		Username: username,
		Sex:      sex,
		Score:    score,
		Grade:    grade,
	
	return

Golang 面向对象编程2

函数不属于任何类型,方法属于特定的类型。

1 方法的定义

Go的方法采用另外一种方式实现。

Go 的方法是在函数前面加上一个接受者,这样编译器就知道这个方法属于哪个类型了。

package main

import "fmt"

// struct 值类型
type People struct 
	Name    string
	Country string


func (p People) Print() 
	fmt.Printf("name=%s country=%s\\n", p.Name, p.Country)


func (p People) Set(name string, country string) 
	p.Name = name
	p.Country = country


func main() 
	// p1 值拷贝
	var p1 People = People
		Name:    "people01",
		Country: "china",
	
	p1.Print()
	// 这样是修改不了结构本身的值的,因为是值拷贝
	p1.Set("peple_set", "shanghai")

PS E:\\TEXT\\test_go\\one> go run .\\main.go
name=people01 country=china
PS E:\\TEXT\\test_go\\one>

可以为当前包内定义的任何类型增加方法。

package main

import "fmt"

type Integer int

func (i Integer) Print() 
	fmt.golang面向对象编程(上)(代码片段)

...用户输入的小猫名错误,则显示张老太没有这只猫猫Golang语言面向对象说明Go 查看详情

golang面向对象编程—工厂模式创建实例(代码片段)

工厂模式说明引入工厂模式跨包创建实例说明Golang的结构体没有构造函数,通常可以使用工厂模式来解决这个问题。引入看一个需求:packagemaintypeStudentstruceNamestring...因为这里的Student的首字母S是大写的,如果我们想... 查看详情

golang面向对象编程(代码片段)

阅读目录Golang面向对象编程11struct声明和定义struct初始化方法1struct初始化方法2结构体类型指针2struct的内存布局及构造函数结构体没有构造函数,必要时需要自己实现匿名字段和嵌套3匿名字段和struct嵌套匿名结构体匿名结构... 查看详情

golang面向对象编程—方法(代码片段)

方法基本介绍方法的声明方法快速入门案例方法的调用和传参机制原理方法和函数的区别方法使用的注意事项基本介绍在某些情况下,我们需要声明(定义)方法。比如Person结构体:除了有一些字段外,Person... 查看详情

golang中结构体struct(代码片段)

前言这里总结的Golang笔记只适合有点编程基础的人看,比如Java往期内容:Golang学习【day1】变量、类型Golang学习,指针,循环控制相关循环结构控制、包函数的使用异常处理、数组老奶奶可以看懂的切片老奶奶可... 查看详情

golang中结构体struct(代码片段)

前言这里总结的Golang笔记只适合有点编程基础的人看,比如Java往期内容:Golang学习【day1】变量、类型Golang学习,指针,循环控制相关循环结构控制、包函数的使用异常处理、数组老奶奶可以看懂的切片老奶奶可... 查看详情

golang面向对象编程思想(代码片段)

抽象介绍:  在定义一个结构体的时候,实际上就是把一类事物的共有属性(字段)和行为(方法) 提取出来,形成一个物理模型(模板),这种研究问题的方法称为抽象。封装:  把抽象出的字段和对字段的操作封装... 查看详情

golang如何体现面向对象三大特征之封装?(代码片段)

封装基本介绍封装介绍封装的好处golang如何体现封装封装的实现基本介绍Golang仍然有面向对象编程的继承、封装和多态的特性,只是实现的方法和其它OOP语言不一样,下面我们来看看Golang是如何实现封装的。封装介绍封... 查看详情

golang的面向对象实现(代码片段)

GoLang的面向对象通过golang实现面向对象的过程,以及golang的继承关系定义了动物,定义了鸟类,鱼类,最后的对象是燕子,Nimopackagemainimport"fmt"typeAnimalinterfaceEat()Play()typeanimalstructnamestringtypeBirdinterfaceAnimal//匿名嵌入接口Fly()typebird... 查看详情

golang碎片整理之结构体(代码片段)

...集合,可以用于描述一个实体对象,类似Java中的class,是golang面向对象编程的基础。结构体的概念在软件工程上的旧术语是ADT(抽象数据类型:AbstractDatetype)。在c++它也是存在,并且名字也是struct,在面向对象的编程语言中,跟一... 查看详情

golang面向对象全解(代码片段)

Golang面向对象全解    golang的面向对象是不完备的面向对象,大部分人员都是从java转换而来,造成了很多的坑,这一篇文章记录我已知的golang面向对象性质和坑,希望后来者注意。    此文仅是个人在学习过... 查看详情

golang接口---上(代码片段)

GoLang接口---上定义隐式接口类型接口底层数据接口类型结构体itab结构体接口嵌套接口指针和接口golang中的值方法和指针方法参考代码必须能够被人阅读,只是机器恰好可以执行定义Go语言不是一种“传统”的面向对象编程语... 查看详情

golang-struct

Golang-struct  Golang语言面向对象编程说明    1)Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性是比较准确的。    2)Golang没有类(c... 查看详情

面向对象编程(代码片段)

面向对象编程文章目录面向对象编程两种编程方式类和对象的定义面向对象编程三步骤一、定义类二、造对象三、发消息案例静态方法、类方法面向对象解决实际问题魔术方法面向对象四大支柱继承多态对象之间的关系最终总结... 查看详情

golang函数返回值少用对象(代码片段)

口号提倡面向接口编程代码问题抛出为了返回一个对象给业务调用里面的方法,写了一个NewMySQL函数返回这个对象,大家帮我看看有没有问题packagemainimport"fmt"typeDaointerface SelectData()typeMySQLstructfunc(mMySQL)SelectData() return... 查看详情

golang学习路径03面向对象封装继承多态(代码片段)

六、面向对象仅支持封装,不支持继承和多态go语言没有class有structgo没有构造器,可以使用工厂方法代替通过面向对象学习struct和interface6.1type关键字定义一种新的数据类型functestType() //type代表定义一种新的类型,这... 查看详情

python之面向对象(代码片段)

一、三大编程范式python是一门面向对象的编程语言。不同的编程样式有不同的风格,不同的风格有他不同的牛逼之处。三大编程范式:面向过程编程函数式编程面向对象编程二、面向对象设计与面向对象编程面向对象设计(Object... 查看详情

面向对象编程(代码片段)

创建类和对象 面向对象编程是一种编程方式,此编程方式的落地需要使用“类”和“对象”来实现,所以,面向对象编程其实就是对“类”和“对象”的使用。类:就是一个模板,模板里可以包含多个函数,函数里实现一些... 查看详情