目录:

  • 方法的定义
  • 函数和方法的区别
  • 值类型和指针类型
  • 面向对象和继承
  • 结构体和json序列化

方法的定义

1、和其他语言不一样,Go的方法采⽤用另外一种方式实现。

package main

import "fmt"

type Integer int

func (i Integer) Print() {
fmt.Println(i)
} func main() {
var a Integer
a = 1000
a.Print() var b int = 200
a = Integer(b)
a.Print()
} // 结果
// 1000
// 200

  

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

type A struct {
}
func (a A) Test(s string) {
}

  Test的接受者,因此A这个对象有一个Test方法。

  通过a来访问A的实例例中的成员变量量,也就是struct中的字段

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

type int Integer //Integer是int的别名
func (a Integer) Test(s string) {
}

  通过a来访问Integer的实例例中的成员变量量,也就是int

  Test的接受者,因此Integer这个对象有一个Test方法

函数和方法的区别

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

type People struct {
Name string
Country string
} // 函数
fun PrintTest(){
fmt.Printf("name=%s country=%s",People.Name,People.Country)
} // 方法
func (p People) Print() {
fmt.Printf("name=%s country=%s\n", p.Name, p.Country)
}

  

值类型和指针类型

1、 指针类型作为接受者

type A struct {
}
func (a *A) Test(s string) {
}

  Test的接受者,因此A这个对象有⼀一个Test⽅方法

  通过a来访问A的实例例中的成员变量量,也就是struct中的字段

2、指针类型和值类型作为接受者的区别

// 值类型,copy原理,性能不好
func (p People) Set(name string, country string) {
p.Name = name
p.Country = country }
// 必须使用指针,否则更改不了原始数据
func (p *People) SetV2(name string, country string) {
p.Name = name
p.Country = country }

3、什么时候⽤用值类型/指针类型作为接受者?

A. 需要修改接受者中的值的时候
B. 接受者是大对象的时候,副本拷贝代价比较大
C. 一般来说,通常使用指针类型作为接受者

面向对象和继承

1、 匿名结构体与继承

type Animal struct {
Name string
} type People struct {
Sex string
Age int
Animal //or *Animal
}

  

2、多重继承与冲突解决

type Mother struct {
Name string
} type Father struct {
Name string
} type People struct {
Sex string
Age int
*Mother
*Father
}

  

结构体和json序列化

1、结构体序列列化:结构体转成json数据格式

type People struct {
Sex string
Age int
*Mother
*Father
}

  

2、结构体反序列列化:json数据格式转成结构体

package main

import (
"encoding/json"
"fmt"
) type Student struct {
Id string
Name string
Sex string
} type Class struct {
Name string
Count int
Students []*Student
} // json用反引号引起来
var rawJson = `{"Name":"101","Count":0,"Students":[{"Id":"0","Name":"stu0","Sex":"man"},{"Id":"1","Name":"stu1","Sex":"man"},{"Id":"2","Name":"stu2","Sex":"man"},{"Id":"3","Name":"stu3","Sex":"man"},{"Id":"4","Name":"stu4","Sex":"man"},{"Id":"5","Name":"stu5","Sex":"man"},{"Id":"6","Name":"stu6","Sex":"man"},{"Id":"7","Name":"stu7","Sex":"man"},{"Id":"8","Name":"stu8","Sex":"man"},{"Id":"9","Name":"stu9","Sex":"man"}]}` func main() {
c := &Class{
Name: "101",
Count: 0,
} for i := 0; i < 10; i++ {
stu := &Student{
Name: fmt.Sprintf("stu%d", i),
Sex: "man",
Id: fmt.Sprintf("%d", i),
}
c.Students = append(c.Students, stu)
} // json 序列化
data, err := json.Marshal(c)
if err != nil {
fmt.Println("json marshal failed")
return
} fmt.Printf("json:%s\n", string(data)) // json 反序列化
fmt.Println("unmarsha1 result is \n\n")
var c1 *Class = &Class{}
err = json.Unmarshal([]byte(rawJson), c1)
if err != nil {
fmt.Println("unmarhsal failed")
fmt.Println(err)
return
}
fmt.Printf("c1:%#v\n", c1) for _, v := range c1.Students {
fmt.Printf("stu:%#v\n", v)
}
}

  

【原创】go语言学习(十三)struct介绍2的更多相关文章

  1. C语言学习笔记--struct 和 union关键字

    1.struct关键字 C 语言中的 struct 可以看作变量的集合struct中的每个数据成员都有独立的存储空间. 结构体与柔性数组 (1)柔性数组即数组大小待定的数组 (2)C 语言中可以由结构 ...

  2. Dart语言学习(十三) Dart Mixins 实现多继承

    Mixins Mixins(混入功能)相当于多继承,也就是说可以继承多个类,使用with关键字来实现Mixins的功能. 那么多个类中有相同的方法时候,会被覆盖吗?覆盖的先后是什么? class A{ ...

  3. c语言学习基础:[1]开发工具介绍

    标签:c语言 1 2 3 4 分步阅读 学习编程语言的童鞋们一开始接触到的最多的估计就是C语言了,其次才是什么java.c++等,可以说学习c语言是我们走向编程世界的一座桥梁,学好它,对于我们学习和研 ...

  4. Go语言学习笔记十三: Map集合

    Go语言学习笔记十三: Map集合 Map在每种语言中基本都有,Java中是属于集合类Map,其包括HashMap, TreeMap等.而Python语言直接就属于一种类型,写法上比Java还简单. ...

  5. c++学习笔记---01---C++语言与OO思想介绍

    C++语言与OO思想介绍 C++的特点与OO思想 C语言有一个优点,即它的速度可以很快.写出来的程序可以很精练.简单.小巧,不用为了解决某个问题环绕太平洋一大圈. 但如果将C和C++相比较,C++就经 ...

  6. 12天学好C语言——记录我的C语言学习之路(Day 12)

    12天学好C语言--记录我的C语言学习之路 Day 12: 进入最后一天的学习,用这样一个程序来综合考量指针和字符串的关系,写完这个程序,你对字符串和指针的理解应该就不错了. //输入一个字符串,内有 ...

  7. 12天学好C语言——记录我的C语言学习之路(Day 3)

    12天学好C语言--记录我的C语言学习之路 Day 3: 不知不觉到了第三天的学习,我们前两天学习的东西很杂乱,各个方面都有学习.我觉得这不是不系统,也不是学的不扎实,这种学习对于初学者而言我认为是很 ...

  8. 12天学好C语言——记录我的C语言学习之路(Day 2)

    12天学好C语言--记录我的C语言学习之路 Day 2: 我建议大家每一天学习之前都仅凭记忆去敲前一天敲过的最后一个程序,或者敲前一天你认为最难最长的一个程序,如果一晚上的睡眠之后不看书还能敲的出来, ...

  9. 12天学好C语言——记录我的C语言学习之路(Day 1)

    12天学好C语言--记录我的C语言学习之路 Day 1: 刚刚入门C语言,那么肯定要先把什么是C语言和大家讲清楚,那么大家看下面一段程序(program  1.1): /*//program 1.1 ...

  10. c语言学习书籍推荐《C语言学习路线图•C语言必须知道的300个问题》下载

    下载地址:点我 <C语言学习路线图•C语言必须知道的300个问题>以基础知识为框架,介绍了c语言各部分知识所对应的常见开发疑难问题,并作了透彻地解析.<C语言学习路线图•C语言必须知 ...

随机推荐

  1. 在论坛中出现的比较难的sql问题:30(row_number函数 物料组合问题)

    原文:在论坛中出现的比较难的sql问题:30(row_number函数 物料组合问题) 在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所 ...

  2. javascript 之 call,apply原理

    一.call原理 1.使用JQuery的call功能 var add(c,d){ return this.a+this.b+c+d } var obj={a:1,b:2} add.Call(obj,3 ...

  3. eclipse 部署Tomcat 只有web-inf webapps没有项目文件

    只有webapps 修改eclipse 默认的 发布位置改为 tomcat的安装位置 eclipse 默认的web-content 改为webroot ,发布后web-inf目录下才会有webroot ...

  4. VBA While Wend循环

    在While...Wend循环中,如果条件为True,则会执行所有语句,直到遇到Wend关键字. 如果条件为false,则退出循环,然后控件跳转到Wend关键字后面的下一个语句. 语法 以下是VBA中 ...

  5. 弹性布局flex 介绍

    摘自:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html 网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模 ...

  6. 如何使用async和await这对组合设计统一的取Access Token的函数

    最近我在使用SAP云平台的机器学习API做和SAP系统的集成,因为SAP Cloud Platform Leonardo上的机器学期API,每次消费时需要传一个Access Token,故在每次实际调 ...

  7. Swagger 接口文档规范

    导语: 相信无论是前端还是后端开发,都或多或少地被接口文档折磨过.前端经常抱怨后端给的接口文档与实际情况不一致.后端又觉得编写及维护接口文档会耗费不少精力,经常来不及更新.其实无论是前端调用后端,还是 ...

  8. 记录--linux下mysql数据库问题

    本次主要记录一下linux下mysql数据库的一些问题,也是之前经常用到的知识,这里简单总结一些问题,方便自己以后的回顾.原来一直使用的是阿里云的RDS数据库mysql版,主要是因为上次阿里云做活动可 ...

  9. Android笔记(三十三) Android中线程之间的通信(五)Thread、Handle、Looper和MessageQueue

    ThreadLocal 往下看之前,需要了解一下Java的ThreadLocal类,可参考博文: 解密ThreadLocal Looper.Handler和MessageQueue 我们分析一下之前的 ...

  10. 【问题】man手册如何查看区分printf命令和printf函数

    参考:UNIX / Linux Man Command Example to View Man Pages 今天再看别人博客的时候,先仔细看看printf命令是怎么玩的,于是man手册查了下.结果搜出 ...