Go结构体struct

Go语言的结构体(struct)和其他语言的类(class)有同等的地位,但Go语言放弃了包括继承在内的大量面向对象特性,只保留了组合(composition)这个最基础的特性。

package main

import (
"fmt"
)
//声明
type Student struct {
Id int
Name string
age int
} func main() {
var s Student
s.Id =1
s.Name ="greg"
s.age=20
fmt.Println(s)
fmt.Printf("Name:%p\n", &s.Name)
fmt.Printf("Id:%p\n", &s.Id)
fmt.Printf("Age: %p\n", &s.age) s1 := Student {
Id :2,
Name:"gregory",
age:20,
}
fmt.Println(s1)
s1=s
fmt.Println(s1) var s2 *Student = &Student{
Id:3,
age: 20,
Name: "greg",
}
fmt.Println(s2)
}

结构体指针

package main

import "fmt"

//结构体指针
type Student struct {
Id int
Name string
} func main(){
s1 := Student{
Id :2,
Name:"greg",
}
fmt.Println(s1) var p *Student
p = &s1
p.Id =3
fmt.Println(s1) var p1 *int
p1 = &s1.Id
*p1 = 4
fmt.Println(s1)
}

结构体性质

结构体是用户单独定义的类型,不能和其他类型进行强制转换

package main

import "fmt"

type integer int

type Student struct {
Id int
} type Stu Student //alias func main() {
var i integer = 1000
var j int = 100
//j = i cannot use
j = int(i)
fmt.Println(j) var a Student
a = Student{30}
fmt.Println(a) var b Stu
//a=b cannot use
a = Student(b) //转换
fmt.Println(a)
}

我们可以为struct中的每个字段,写上一个tag。这个tag可以通过反射的机制获取到,最常用的场景就是json序列化和反序列化。

type student struct {
Id int “this is Id field”
Name stirng “this is name field”
}

序列化和反序列化

package main

import (
"fmt"
"encoding/json"
"log"
) type Student struct {
Id int
Name string
} func main(){
s := Student{
Id:1,
Name:"greg",
}
fmt.Println(s)
buf,err := json.Marshal(s)
if err != nil{
log.Fatalf("marshal error:%s",err)
}
fmt.Println(string(buf)) str := `{"Id":2,"Name":"alice"}`
var s2 Student
err1 := json.Unmarshal([]byte(str),&s2)
if err1 != nil {
log.Fatalf("unmarshal error:%s",err)
}
fmt.Println(s2)
}
//将Student map的数据写入到文件

结构体中字段可以没有名字,即匿名字段

访问匿名字段

package main

import (
"fmt"
"time"
) type Student struct {
name string
age int
} type Class struct {
Student
name string
int
Start time.Time
age int
} type School struct {
Student
Class
} func main() {
var t Class
t.Student.name = "stu"
t.Student.age = 100 t.name="cls"
t.age=80
t.int=2000
fmt.Println(t)
}

匿名字段冲突处理

package main

import (
"fmt"
) type Student struct {
name string
age int
} type Class struct {
name string
age int
} type School struct {
Student
Class
} func main() {
var t School
t.Student.name = "stu"
t.Class.name = "cls"
fmt.Println(t)
}

方法

Golang中的方法是作用在特定类型的变量上,因此自定义类型,都可以有方法,而不仅仅是struct

定义:func (recevier type) methodName(参数列表)(返回值列表){}

方法调用

package main

type Point struct {
X, Y float64
} func (p *Point) ScaleBy(factor float64) {
p.X *= factor
p.Y *= factor
} func main() {
//直接指针
p := &Point{1,2}
p.ScaleBy(2) //声明结构体后再用指针指向
p1 := Point{1,2}
p2 := &p1
p2.ScaleBy(2) //使用结构体调用,隐式取地址
p3 := Point{1,2}
p3.ScaleBy(2) //等价于(&p3).ScaleBy(2)
}

结构体方法调用:

package main

import "fmt"

type Student struct {
Id int
Name string
Age int
Score int
} func (p *Student) init(name string, age int, score int) {
p.Name = name
p.Age = age
p.Score = score
fmt.Println(p)
} func (p Student) get() Student {
return p
} func main() {
var stu Student
(&stu).init("stu", 10, 200) stu1 := stu.get()
fmt.Println(stu1)
}

练习:两点之间的距离

package main

import (
"fmt"
"math"
) type Point struct {
X,Y float64
} func (p Point) Distance(q Point) float64 {
return math.Hypot(q.X-p.X, q.Y-p.Y)
} func main() {
p := Point{1,2}
q := Point{4,6}
fmt.Println(p.Distance(q))
}

方法和函数的区别:

函数调用: function(variable, 参数列表)
方法:variable.function(参数列表)

指针receiver和值receiver:本质上和函数的值传递和地址传递是一样的

方法的访问控制:可见性

通过首字母大小写来控制可见性

可见性是package级别的

继承:

如果一个struct嵌套了另一个匿名结构体,那么这个结构可以直接访问匿名结构体的方法,从而实现了继承。

package main

import "fmt"

type Student struct {
Id int
name string
} func (p *Student) Run() {
fmt.Println("greg")
} type Class struct {
Student
golang string
} type School struct {
gregs Student
} func main() {
var c Class
c.Id = 100
c.name = "greg2"
c.golang = "一班" fmt.Println(c)
c.Run() var sch School
sch.gregs.Id = 100
sch.gregs.name = "train"
fmt.Println(sch)
sch.gregs.Run()
}

组合和匿名字段:

​ 如果一个struct嵌套了另一个匿名结构体,那么这个结构可以直接访问匿名结构体的方法,从而实现了继承。

​ 如果一个struct嵌套了另一个有名结构体,那么这个模式就叫组合。

多重继承:如果一个struct嵌套了多个匿名结构体,那么这个结构可以直接访问多个匿名结构体的方法,从而实现了多重继承。

GO开发[五]:golang结构体struct的更多相关文章

  1. Golang结构体struct的使用(结构体嵌套, 匿名结构体等)

    转自: https://studygolang.com/articles/11313 golang中是没有class的,但是有一个结构体struct,有点类似,他没有像java,c++中继承的概念,但 ...

  2. sql自动生成golang结构体struct实体类

    废话不多说直接上地址 使用地址 http://www.linkinstars.com:8090/auto-code 项目github https://github.com/LinkinStars/Au ...

  3. Golang 入门 : 结构体(struct)

    Go 通过类型别名(alias types)和结构体的形式支持用户自定义类型,或者叫定制类型.试图表示一个现实世界中的实体. 结构体由一系列命名的元素组成,这些元素又被称为字段,每个字段都有一个名称和 ...

  4. golang结构体json格式化的时间格式

    golang结构体json格式化的时间格式 在我们开发中,经常会解析time.Time 往往前台传过来的时候,是个string 但是我们希望在结构体转成time.Time type Param str ...

  5. Go语言学习笔记(四)结构体struct & 接口Interface & 反射

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...

  6. 对嵌入式开发C语言结构体的一点总结

    今天冬至居然不上班,公司的良心啊!这回有心情写博客和日志了,好了,废话不多说.直接看下文: 鉴于嵌入式开发过程中,C语言结构体的使用当然是必不可少.话说,基础什么的比你会更牛逼的算法更重要,基础不牢, ...

  7. golang 结构体中的匿名接口

    golang 结构体中的匿名接口 代码示例 golang 中,可以给结构体增加匿名field,可参考 unknwon 大神的书. 匿名字段和内嵌结构体 但,golang同时也可以给结构体定义一个匿名i ...

  8. golang结构体、接口、反射

    struct结构体 struct用来自定义复杂数据结构,可以包含多个字段属性,可以嵌套; go中的struct类型理解为类,可以定义方法,和函数定义有些许区别; struct类型是值类型. struc ...

  9. Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...

随机推荐

  1. Java版本APP接口安全设计

    Java版本APP接口安全设计 安全设计分为两种: 1.传输安全. 2. 会话安全. 1.传输安全 怎么保证接口经过网络传输不被抓包获取? 1.如果只是使用对称性算法,破解APP拿到加密密钥就可以解密 ...

  2. copy&deepcopy

    import copy 字典参照列表结论,看是否有深层嵌套. a = {'name':1,'age':2} b = a a['name'] = 'ff' print(a) print(b) print ...

  3. Python的变量和常量

    解释器执行Python的过程:   (python3,c:/test.py) 1:启动python解释器(内存中). 2:将c:/test.py内容从硬盘读到内存中(这一步和文本编辑器是一样的). 3 ...

  4. Fiddler中设置断点修改返回结果Response

    测试有时会遇到需要测试返回不同的数据前端展示出来会如何?如果去数据库中的数据会比较麻烦.这样我们可以通过fiddler设置断点来修改返回的数据实现测试不同的数据展示. 1.设置断点 (1)点击菜单栏按 ...

  5. Java Proxy和CGLIB动态代理原理

    动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...

  6. 为什么很多第三方接口,都改成了基于http,直接传递json数据的方式来代替webservice?

    这实际上是三个问题,从WebService到今天流行的RESTful API(JSON) over HTTP,经历了数次变革 1 WebService有很多协议,为什么HTTP比较流行? WebSer ...

  7. FFmpeg编译iOS静态库

    第一步:下载gas-preprocessor 1.1 下载https://github.com/libav/gas-preprocessor 1.2 拷贝 gas-preprocessor.pl 到 ...

  8. 表单验证插件--formvalidation

    表单验证是一个非常基础的功能,当你的表单项少的时候,可以自己写验证,但是当你的表单有很多的时候,就需要一些验证的插件.今天介绍一款很好用的表单验证插件,formvalidation.其前身叫做boot ...

  9. windows服务管理操作

    服务程序是windows上重要的一类程序,它们虽然不与用户进行界面交互,但是它们对于系统有着重要的意义.windows上为了管理服务程序提供了一个特别的程序:服务控制管理程序,系统上关于服务控制管理的 ...

  10. SLAM入门之视觉里程计(5):单应矩阵

    在之前的博文OpenCV,计算两幅图像的单应矩阵,介绍调用OpenCV中的函数,通过4对对应的点的坐标计算两个图像之间单应矩阵\(H\),然后调用射影变换函数,将一幅图像变换到另一幅图像的视角中.当时 ...