02 Golang面向对象编程_20240727 课程笔记

news2024/9/18 12:36:47

视频课程

最近发现越来越多的公司在用Golang了,所以精心整理了一套视频教程给大家,这个是其中的第二部,后续还会有很多。

视频已经录制完成,完整目录截图如下:
在这里插入图片描述

课程目录

  • 01 结构体的声明.mp4
  • 02 使用var根据结构体创建对象.mp4
  • 03 使用new根据结构体创建对象.mp4
  • 04 使用取地址符根据结构体创建对象.mp4
  • 05 结构体的顺序初始化.mp4
  • 06 通过工厂函数创建结构体对象.mp4
  • 07 将结构体对象转换为JSON字符串.mp4
  • 08 将JSON字符串转换为结构体对象.mp4
  • 09 结构体的标签.mp4
  • 10 结构体的嵌套.mp4
  • 11 结构体的方法.mp4
  • 12 接口的基本用法.mp4
  • 13 通过接口实现多态.mp4
  • 14 练习:求三角形的面积.mp4
  • 15 面向对象的封装性.mp4
  • 16 练习:多态求几何图形的面积.mp4
  • 17 接口的组合.mp4
  • 18 接口的类型推断.mp4
  • 19 通过反射获取变量的类型.mp4
  • 20 通过反射判断变量的类型.mp4
  • 21 通过反射修改变量的值.mp4

每节课的代码

01 结构体的声明.mp4

package main

// 使用type进行声明
// 使用struct说明这是一个结构体,类似于Java中的class声明一个类
type User struct {
	name string // 小写的说明是内部使用,类似于Java的private
	Age  int    // 大小的说明是外部使用,类似于Java的public
}

02 使用var根据结构体创建对象.mp4

package main

import "fmt"

// 使用type进行声明
// 使用struct说明这是一个结构体,类似于Java中的class声明一个类
type User struct {
	name string // 小写的说明是内部使用,类似于Java的private
	Age  int    // 大小的说明是外部使用,类似于Java的public
}

func main() {
	var u User
	fmt.Println(u)

	u.name = "张三"
	u.Age = 23
	fmt.Println(u)
}

03 使用new根据结构体创建对象.mp4

package main

import "fmt"

// 使用type进行声明
// 使用struct说明这是一个结构体,类似于Java中的class声明一个类
type User struct {
	name string // 小写的说明是内部使用,类似于Java的private
	Age  int    // 大小的说明是外部使用,类似于Java的public
}

func main() {
	var u = new(User)
	fmt.Println(u)

	u.name = "张三"
	u.Age = 23
	fmt.Println(u)
}

04 使用取地址符根据结构体创建对象.mp4

package main

import "fmt"

// 使用type进行声明
// 使用struct说明这是一个结构体,类似于Java中的class声明一个类
type User struct {
	name string // 小写的说明是内部使用,类似于Java的private
	Age  int    // 大小的说明是外部使用,类似于Java的public
}

func main() {
	var u = &User{
		name: "",
		Age:  0,
	}
	fmt.Println(u)

	u.name = "张三"
	u.Age = 23
	fmt.Println(u)
}

05 结构体的顺序初始化.mp4

package main

import "fmt"

// 使用type进行声明
// 使用struct说明这是一个结构体,类似于Java中的class声明一个类
type User struct {
	name string // 小写的说明是内部使用,类似于Java的private
	Age  int    // 大小的说明是外部使用,类似于Java的public
}

func main() {
	var u = User{"张三", 33}
	fmt.Println(u)
}

06 通过工厂函数创建结构体对象.mp4

package main

import "fmt"

// 使用type进行声明
// 使用struct说明这是一个结构体,类似于Java中的class声明一个类
type User struct {
	name string // 小写的说明是内部使用,类似于Java的private
	Age  int    // 大小的说明是外部使用,类似于Java的public
}

func NewUser(name string, age int) *User {
	return &User{name, age}
}

func main() {
	var u = NewUser("张三", 33)
	fmt.Println(u)
}

07 将结构体对象转换为JSON字符串.mp4

package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	name string
	Age  int
}

func main() {
	var u = User{"张三", 33}
	data, err := json.Marshal(u)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(data))
}

08 将JSON字符串转换为结构体对象.mp4

package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	name string
	Age  int
}

func main() {
	var s = `{"Age":33}`

	var u User
	err := json.Unmarshal([]byte(s), &u)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(u)
	fmt.Println(u.name, u.Age)
}

09 结构体的标签.mp4


package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	var u = User{"张三", 33}
	data, err := json.Marshal(u)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(data))
}

10 结构体的嵌套.mp4

package main

import (
	"encoding/json"
	"fmt"
)

type Address struct {
	Province string `json:"province"`
	City     string `json:"city"`
}

type User struct {
	Name     string  `json:"name"`
	Age      int     `json:"age"`
	UAddress Address `json:"address"`
}

func main() {
	var u = User{"张三", 33, Address{"四川", "成都"}}
	data, err := json.Marshal(u)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(data))
}

11 结构体的方法.mp4

package main

import (
	"fmt"
)

type User struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}
type UserManager struct {
	Users []User `json:"users"`
}

func NewUserManager() *UserManager {
	return &UserManager{
		Users: make([]User, 0),
	}
}

func (um *UserManager) AddUser(u User) {
	um.Users = append(um.Users, u)
}

func main() {
	um := NewUserManager()
	um.AddUser(User{"张三", 33})

	fmt.Println(um.Users)
}

12 接口的基本用法.mp4

package main

import (
	"fmt"
)

type IAnimal interface {
	Walk()
	Talk()
}

type Cat struct{}

func (cat *Cat) Walk() {
	fmt.Println("蹦蹦跳")
}
func (cat *Cat) Talk() {
	fmt.Println("喵喵喵")
}
func main() {
	var animal IAnimal = new(Cat)
	animal.Walk()
	animal.Talk()
}

13 通过接口实现多态.mp4

package main

import (
	"fmt"
)

type IAnimal interface {
	Walk()
	Talk()
}

type Cat struct{}

func (cat *Cat) Walk() {
	fmt.Println("蹦蹦跳")
}
func (cat *Cat) Talk() {
	fmt.Println("喵喵喵")
}

type Dog struct{}

func (cat *Dog) Walk() {
	fmt.Println("四脚着地跑")
}
func (cat *Dog) Talk() {
	fmt.Println("汪汪汪")
}

func main() {
	var animal IAnimal = new(Cat)
	animal.Walk()
	animal.Talk()

	animal = new(Dog)
	animal.Walk()
	animal.Talk()
}

14 练习:求三角形的面积.mp4

package main

import "fmt"

type Triangle struct {
	Bottom float32
	Height float32
}

func (t *Triangle) Area() float32 {
	return (t.Height * t.Bottom) / 2
}

func main() {
	t := &Triangle{8, 12}
	fmt.Println(t.Area())
}

15 面向对象的封装性.mp4

package user

type User struct {
	name string
}

func (u *User) SetName(name string) {
	u.name = name
}

func (u *User) GetName() string {
	return u.name
}

package main

import (
	"fmt"
	"hello_go/c15_user/user"
)

func main() {
	zs := &user.User{}
	zs.SetName("张三")
	fmt.Println(zs.GetName())
}

16 练习:多态求几何图形的面积.mp4

package main

import "fmt"

type IShape interface {
	Area() float32
}

type Triangle struct {
	Bottom float32
	Height float32
}

func (t *Triangle) Area() float32 {
	return (t.Height * t.Bottom) / 2
}

type Square struct {
	Width  float32
	Height float32
}

func (s *Square) Area() float32 {
	return s.Height * s.Width
}

func main() {
	var s IShape

	s = &Triangle{8, 12}
	fmt.Println(s.Area())

	s = &Square{8, 12}
	fmt.Println(s.Area())
}

17 接口的组合.mp4

package main

type IRead interface {
	Read(path string)
}
type IWrite interface {
	Write(p []byte)
}

// 既拥有IRead相关的接口,也拥有IWrite相关的接口
type IFile interface {
	IRead
	IWrite
}

18 接口的类型推断.mp4

package main

import "fmt"

func main() {
	var a interface{} = 33

	switch a.(type) {
	case int:
		fmt.Println("int")
	case string:
		fmt.Println("string")
	default:
		fmt.Println("unknown")
	}
}

19 通过反射获取变量的类型.mp4

package main

import (
	"fmt"
	"reflect"
)

func main() {
	var a interface{} = 33

	fmt.Println(reflect.TypeOf(a))
}

20 通过反射判断变量的类型.mp4

package main

import (
	"fmt"
	"reflect"
)

func main() {
	var a interface{} = 33

	ra := reflect.ValueOf(a)

	fmt.Println("type:", ra.Type())
	fmt.Println(ra.Kind())
	fmt.Println(ra.Kind() == reflect.Int)
}

21 通过反射修改变量的值.mp4

package main

import (
	"fmt"
	"reflect"
)

func main() {
	a := 33
	fmt.Println("修改之前:", a)

	// 如果要修改,一定要传引用
	ra := reflect.ValueOf(&a)

	rae := ra.Elem()
	rae.SetInt(333)

	fmt.Println("修改之后:", a)
}

代码截图

在这里插入图片描述

总结

本套教程作为Go语言的零基础入门课程,主要讲解了Go语言的一些入门级别的简单基础知识,每节课都附上了完整的源码,以实战为主。

如果您需要完整的源码,打赏20元即可。

人生苦短,我用Python,我是您身边的Python私教~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1953707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Firefox扩展程序和Java程序通信

实现Firefox扩展程序,和Java RMI Client端进行通信。 在Firefox工具栏注册按钮,点击按钮后弹出Popup.html页面,引用Popup.js脚本,通过脚本向Java RMI client发送消息,Java RMI Client接收消息后转发到Java RMI Server…

Docker————数据卷容器,容器互联,镜像创建

1、Docker的数据管理 管理Docker容器中的数据,主要有两种方式:数据卷(Data Volumes)和数据卷容器(DataVolumes Containers). docker run [-i -t] [--name 容器名] 镜像名:标签 [容器启动命令]…

RK3568 Linux 平台开发系列讲解(内核入门篇):从内核的角度看外设芯片的驱动

在嵌入式 Linux 开发中,外设芯片的驱动是实现操作系统与硬件之间交互的关键环节。对于 RK3568 这样的处理器平台,理解如何从内核的角度构建和管理外设芯片的驱动程序至关重要。 1. 外设驱动的基础概念 外设驱动(Device Driver)是操作系统与硬件设备之间的桥梁。它负责控…

智能浇花机器人·设计说明

智能浇花机器人 目录: 第一章 :项目描述 1 1.1 项目简介 1 1.1.1 服务范围: 1 1.1.2 所处行业: 1 1.2 项目背景 1 1.3 创新点与项目特色 3 第二章 :设计说明书 4 2.1 主要构成: 4 2.1.1 循迹小车 4 2.1.2 机械…

网络编程——wireshark抓包、tcp粘包

目录 一、前言 1.1 什么是粘包 1.2 为什么UDP不会粘包 二、编写程序 文件树 客户端程序 服务器程序 tcp程序 头文件 makefile 三、 实验现象 四、改进实验 五、小作业 一、前言 最近在做网络芯片的驱动,验证功能的时候需要借助wireshark这个工具&…

DataX(二):DataX安装与入门

1. 官方地址 下载地址:http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz 源码地址:GitHub - alibaba/DataX: DataX是阿里云DataWorks数据集成的开源版本。 2. 前置要求 Linux JDK(1.8 以上,推荐 1.8) Python(推荐 Pyt…

C语言内存函数精讲

目录 引言 1.内存分配函数malloc 2.内存释放函数free 3.内存拷贝函数memcpy 4.内存移动函数memmove 5.内存设置函数memset 6.内存比较函数memcmp 总结 引言 在C语言编程中,内存管理是核心技能之一。C语言提供了一系列内存操作函数,这些函数在动…

机器学习 第7章-贝叶斯分类器

机器学习 第7章-贝叶斯分类器 7.1 贝叶斯决策论 贝叶斯决策论(Bayesian decision theory)是概率框架下实施决策的基本方法。对分类任务来说,在所有相关概率都已知的理想情形下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记。下面我…

Linux Vim全能攻略:实战代码,轻松掌握文本编辑神器

1. Vim简介与安装 1.1 Vim的历史与发展 Vim(Vi IMproved)是一款高度可配置的文本编辑器,它起源于1976年由Bill Joy开发的Vi编辑器。Vi是Unix系统上最古老的文本编辑器之一,因其强大的功能和高效的编辑方式而广受欢迎。随着时间的…

流媒体服务器一:搭建RTMP流媒体服务器搭建

1 安装和测试srs流媒体服务器 服务器:SRS(Simple RTMP Server,⽀持RTMP、HTTP-FLV,HLS) 推流端:ffmpeg OBS 拉流端:ffplay VLC srs播放器 1.1 安装srs流媒体服务器 官网 SRS (Simple Realtime Server) | SRS 码…

【一图流】Git下载与安装教程

下载Git Git官网:https://git-scm.com/?hlzh-cn 安装Git

全栈嵌入式C++、STM32、Modbus、FreeRTOS和MQTT协议:工业物联网(IIoT)可视化系统设计思路(附部分代码解析)

项目概述 随着工业4.0时代的到来,工业物联网(IIoT)在提高生产效率、降低运营成本和实现智能制造方面得到了广泛应用。本项目旨在开发一个全面的工业物联网监控系统,能够实时监测设备的温度、压力、振动和电流等参数,并…

浅析Jeecgboot中mybatisplus不支持Postgres SKIP LOCKED语法问题

目录 1、场景及问题 2、数据库及各框架版本信息 3、错误回放 4、根因分析及确认 5、解决问题 6、总结 1、场景及问题 场景: 在调用腾讯位置服务时有用到key值,因为每个key值都有自己的额度,所以在表里存了多个key,简称key池&…

基于Java的城市公交管理系统/SSM的城市公交查询系统/计算机专业/课设

摘 要 网络技术的不断发展,使网络成为人们的日常生活中不可缺少的一部分,而城市公交管理系统是网络的一种新型体现,它以其特有的便捷和快速的特点得到了广泛的认可。当前的城市公交管理系统不仅没有建立起整体的管理系统,为企业定…

Go语言中常见的多线程同步方法

什么是线程、进程、协程 Go 源文件经过编译器处理后,会产生可执行文件,不同系统有不同的格式。可执行文件在操作系统上执行一次,就对应一个进程 进程可以理解为执行中的程序,是一个动态的概念,同一份可执行文件执行多…

Django 表单error_messages , 表单校验提示

在Django中,error_messages是表单字段的一个参数,允许你为特定的验证错误自定义错误消息。默认情况下,Django的表单字段会为常见的验证错误提供默认的错误消息。但是,你可能想要为你的应用提供更加用户友好的或者本地化的错误消息…

成为git砖家(2): gitk 介绍

大家好,我是白鱼。这篇我们介绍 gitk。 gitk 和 fork 界面对比 当我们在 macOS 上执行 brew install git 后, 得到了 git 命令行工具。 然而这条命令并不会安装 gitk. gitk 是 git 自带的图形化界面工具,也可以称为“穷人版 fork”&#xf…

如何穿透模糊,还原图片真实面貌

目录 图像清晰化的魔法棒:AI如何穿透模糊,还原图片真实面貌 前言 论文背景 论文思路 模型介绍 复现过程 演示视频 使用方式 本文所涉及所有资源均在传知代码平台可获取。 图像清晰化的魔法棒:AI如何穿透模糊,还原图片真实面貌 在我…

使用Docker搭建MySql的主从同步+ShardingSphere搭建Mysql的读写分离

参考课程 尚硅谷ShardingSphere5实战教程(快速入门掌握核心)_哔哩哔哩_bilibili 主服务器 创建容器 docker run -d \ -p 3306:3306 \ -v /kira/mysql/master/conf:/etc/mysql/conf.d \ -v /kira/mysql/master/data:/var/lib/mysql \ -e MYSQL_ROOT…

java学习---异常

前言 由于被分母不能为0,所以代码到int yn/m;会抛出异常,停止运行下去,但是如果是个庞大的代码,因为这种小错误而整个程序崩溃,会大大影响代码整体的健壮性,所以此时就需要我们得异常处理了 选中异常代码部…