Golang中的面向对象与json转换

一、struct 结构体

1.使用type关键字可以定义新的数据类型。

2.定义结构体,如:

type Book struct{

title string

author string

3.定义并使用结构体变量:var book1 Book,book1.title = “abcd”,book1.author = “efgh”。

4.结构体作为函数参数,传递的是一个结构体副本,传递结构体指针时才会对该结构体对象进行修改。

二、面向对象

1.Go语言中的类,就是通过结构体绑定方法。如定义如下结构体:

type Hero struct{

name string

id int

level int

(1)定义一个方法:func (this Hero) setName(name string) { this.name = name }。此方法中this Hero表示当前方法绑定在了Hero结构体上,方法内部可以通过this.name调用此Hero对象中的name属性。

(2)通过如hero := Hero{name : “zhangsan”, id : 1, level :1}这样的语句创建Hero对象。

(3)如果调用(1)中的方法 hero.setName(“lisi”)是无法真正修改对象hero的name属性的,因为传参为hero对象的一个拷贝,只可读不可写。可以修改方法为:func (this *Hero) setName(name string) { this.name = name },这样即可实现写方法。

(4)如果类名首字母大写,其他包即可使用此对象;如果类中属性名大写,表示此对象的该属性为public属性,对外可访问;方法首字母大写同理,其他包可调用。(首字母大小写可表示此类、属性、方法是否公有/私有)

2.继承

(1)首先定义基本类和方法:

type Human struct{

Name string

Sex string

func (this *Human) Eat(){

fmt.Println(“Human Eat”);

func (this *Human) Walk(){

fmt.Println(“Human Walk”);

创建Human对象:human := Human{“zhangsan”, “man”},调用human.Eat()以及human.Walk()会分别输出不同的字符串,表示不同行为。

(2)定义SuperMan类继承Human类:

type SuperMan struct{

Human //写在这里表示SuperMan类继承Human类。

Level int

重写父类方法Eat:

func (this *SuperMan) Eat(){

fmt.Println(“SuperMan Eat”);

定义新方法Fly:

func (this *SuperMan) Fly(){

fmt.Println(“SuperMan Fly”);

定义子类对象:s := SuperMan{Human{“lisi”, “man”}, 88},调用方法同上;或者通过如下方法定义:

var s SuperMan

s.Name = “lisi”

s.Sex = “Man”

s.Level = 88

3.多态

(1)使用interface关键字定义接口:

type AnimalIF interface{

Sleep()

GetColor() string //获取动物的颜色

GetType() string //获取动物的种类

interface本质是一个指针。

(2)如要定义实体类实现AnimalIF接口,不必按照继承的写法,只需在实体类内部实现接口的全部方法即可:

type Cat struct{

Color string

Type string

//如下所示,Cat实体类实现了AnimalIF接口里的全部方法,说明Cat实体类实现了该接口。在Go语言中interface的实现是隐性的,一个结构体类型如果实现了某interface中的所有方法,则说明了这个interface。

func (this *Cat) Sleep() {

fmt.Println(“Cat is sleeping”)

func (this *Cat) GetColor() string{

return this.Color

func (this *Cat) GetType() string{

return this.Type

(3)定义Dog实体类,同样实现AnimalIF接口中的全部方法:

type Dog struct{

Color string

Type string

//如下所示,Cat实体类实现了AnimalIF接口里的全部方法,说明Cat实体类实现了该接口

func (this *Dog) Sleep() {

fmt.Println(“Dog is sleeping”)

func (this *Dog) GetColor() string{

return this.Color

func (this *Dog) GetType() string{

return this.Type

(4)创建Cat对象和Dog对象:

var animal AnimalIF //接口的数据类型,父类指针

animal = &Cat{“green”, “cat”}

animal.Sleep()

animal = &Dog{“yellow”, “dog”}

animal.Sleep()

此时会依序输出Cat is sleeping和Dog is sleeping,实现多态。

(5)或者定义方法:

func showAnimal(animal AnimalIF){

animal.Sleep()

创建对象:cat := Cat{“green”, “cat”}, dog := Dog{“yellow”, “dog”},可分别调用showAnimal方法:

showAnimal(&cat)

showAnimal(&dog)

效果同(4)。

4.interface{}表示空接口,为万能数据类型,所有数据类型(包括基本数据类型)几乎都实现了interface{}接口。如定义函数:

func myFunc(arg interface{}){

fmt.Println(arg)

此时myFunc函数可以传入任意数据类型的参数,若想在方法体内区分引用的数据类型到底是什么,go语言给interface{}提供了类型断言机制,如:

value, OK := arg.(string)可判断arg传入的参数是否为string,如果是string,则OK此时为true,value为arg的值。

三、json字符串和Golang中的结构体对象相互转换

1.若想完成转换,结构体中属性名需大写,否则json包无法读取。

2.使用json.Marshal(s)方法,可以把结构体对象s转换成对应的json字符串,返回值为[]byte切片和一个error对象。

3.使用json.Unmarshal(bytes, &s)方法,可以把json字符串bytes转换成结构体对象s,参数bytes为一个[]byte切片,&s为结构体对象的地址,返回值为一个error对象。

4.结构体标签:在定义结构体时,在属性名后用反引号指定该属性对应的json序列中的字段名,如:

type Hero struct{

Name string json: "name"

Id int json: "id"

Level int

Original: https://www.cnblogs.com/ThXin/p/16219784.html
Author: 夜满星河
Title: Golang中的面向对象与json转换

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607816/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 5. SpringBoot框架华夏ERP源码审计

    环境搭建 华夏ERP基于SpringBoot框架和SaaS模式,可以算作是国内人气较高的一款ERP项目,看网上已经公开了漏洞,本次对此框架代码进行源码审计。 直接拖入IDEA加载,…

    Java 2023年5月29日
    063
  • 使用Thread类和Runnable接口实现多线程的区别

    先看两种实现方式的步骤: public class ThreadDemo{ public static void main(String[] args) { for (int i …

    Java 2023年6月8日
    082
  • 27.多线程,分组服务端,1万客户端连接,每秒处理200万包

    问题:网络抖动,不能稳定在每秒钟,200万个包。波动比较大,80万—-300万之间波动。 服务端: CELLTimestamp.hpp DataHeader.hpp E…

    Java 2023年5月29日
    069
  • 线程同步

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    054
  • java字符串的比较

    比较在我们开发中会经常用到,比如输入密码,然后进行验证,这就需要前后两次输入密码的比较.在字符串中,下面介绍三种比较方法. ==比较 在存储字符串的过程中,我们知道,变量指向栈,字…

    Java 2023年6月8日
    083
  • Spring AOP的简单示例

    配置文件

    Java 2023年5月30日
    076
  • 面试必问之 ConcurrentHashMap 线程安全的具体实现方式

    作者:炸鸡可乐原文出处:www.pzblog.cn 一、摘要 在之前的集合文章中,我们了解到 HashMap 在多线程环境下操作可能会导致程序死循环的线上故障! 既然在多线程环境下…

    Java 2023年6月9日
    072
  • SpringMvc(三)- CRUD

    1、springMvc的form表单 1.1 标签 1.2 标签 使用springMvc的form表单,快速开发表单及数据自动回显; 原理:在 数据模型中添加一个 参数名为 com…

    Java 2023年6月15日
    068
  • OpenFeign和Consul爱恨交织的两天

    1. 背景 在公司对项目进行拆分,用consul做注册中心。既然弄注册中心了, 那就得远程调用,那就得整上OpenFeign进行远程调用,你说是不? 不能说就搞个RestTempl…

    Java 2023年6月15日
    078
  • WIN7下命令行修改注册表提示拒绝访问的解决

    win7系统的注册表是系统的关键功能之一,一般人不会去修改,在用户使用系统中,如果需要修改注册表却遇到提示拒绝访问要怎么办? 在运行中输入cmd,打开命令行窗口,输入如下测试代码,…

    Java 2023年5月30日
    083
  • Java连载151-JUnit简介以及HashMap初步分析

    一、配置JUnit环境 JUnit是一个集成测试单元框架,我们先下载软件包,来配置环境 <span class="hljs-keyword">pac…

    Java 2023年6月13日
    088
  • java监控文件变化,并分别使用RandomAccessFile和BufferedReader读取

    import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import j…

    Java 2023年5月29日
    095
  • 初等数论

    若整数 n > 1,则 n 可以写为一系列的 质数之积 [n=p_1\cdot{p_2}\cdot{p_3}\ldots ] 上述可以拓展为 分解质因数,并且又因为可能存在 …

    Java 2023年6月16日
    063
  • 隐私计算FATE-多分类神经网络算法测试

    一、说明 本文分享基于 Fate 使用 &#x6A2A;&#x5411;&#x8054;&#x90A6; &#x795E;&#x7E…

    Java 2023年6月6日
    084
  • java面向对象编程1——类及类的成员

    面向过程(pop) vs 面向对象(oop) ​ 面向过程是一种功能行为,以函数为最小单位,考虑的是怎么做 ​ 面向对象强调了具备功能的对象,以类/对象为最小单位,考虑的是谁来做 …

    Java 2023年6月5日
    092
  • Golang中的数组、切片以及map

    一、固定长度数组 1.定义长度固定的数组,如:var arr [10] int;获取数组的长度,使用len函数,即len(arr)。 2.定义长度固定的数组,且初始化,如:arr …

    Java 2023年6月13日
    073
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球