go_结构体和方法
面向对象:go语言仅支持封装不支持继承和多态
所以go语言没有class,只有struct(结构体)
无论地址还是结构本身,一律用 . 来访问成员
go语言编译器可以自动区分是值传递还是指针传递,值传递不会改变原值,指针传递会复制指针地址
要改变内容必须使用指针接收者,结构过大也考虑用指针接收者,如果有指针接收者,最好用指针接收者
使用 new 函数给一个新的结构体变量分配内存,它返回指向已分配内存的指针:var t *T = new(T)
,如果需要可以把这条语句放在不同的行(比如定义是包范围的,但是分配却没有必要在开始就做)。
var t *T
t = new(T)
写这条语句的惯用方法是:t := new(T)
,变量 t
是一个指向 T
的指针,此时结构体字段的值是它们所属类型的零值。
package main
import "fmt" type struct1 struct {
i1 int
f1 float32
str string
} func main() {
ms := new(struct1)
ms.i1 = 10
ms.f1 = 15.5
ms.str= "Chris" fmt.Printf("The int is: %d\n", ms.i1)
fmt.Printf("The float is: %f\n", ms.f1)
fmt.Printf("The string is: %s\n", ms.str)
fmt.Println(ms)
}
package main import "fmt" //结构体,相当于对象,实体
type TreeNode struct {
value int
left,right * TreeNode
} //(node TreeNode)相当于其他语言的this,表示print()是给node接收的
func (node TreeNode) print(){
fmt.Print(node.value," ")
} func (node *TreeNode) traverse(){
if node == nil{
return
}
node.left.traverse()
node.print()
node.right.traverse()
}
func (node *TreeNode) setValue(value int){
if node == nil{
fmt.Println("Setting nil value")
return
}
node.value = value
} //使用工厂函数来构造结构体
func createNode(value int) *TreeNode{
return &TreeNode{value:value}
} func main() {
var root TreeNode
fmt.Println(root)
root = TreeNode{value:3 }
root.left = &TreeNode{}
root.right = &TreeNode{5,nil,nil}
root.right.left = new(TreeNode)
root.left.right = createNode(2)
fmt.Println(root) root.traverse()
//nodes :=[]TreeNode{
// {value:5},
// {},
// {6,nil,&root},
//}
//fmt.Println(nodes) //root.print()
//root.right.left.setValue(8)
//root.right.left.print()
//fmt.Println()
//
//root.print()
//root.setValue(100)
//root.print()
//
//var pRoot *TreeNode
//pRoot.setValue(120)
//pRoot =&root
//pRoot.setValue(220)
//pRoot.print()
//root.print() }
使用工厂方法创建结构体实例
type File struct {
fd int // 文件描述符
name string // 文件名
}
下面是这个结构体类型对应的工厂方法,它返回一个指向结构体实例的指针:
func NewFile(fd int, name string) *File {
if fd < 0 {
return nil
} return &File{fd, name}
}
然后这样调用它:
f := NewFile(10, "./test.txt")
go_结构体和方法的更多相关文章
- 六、golang中的结构体和方法、接口
结构体: 1.用来自定义复杂数据结构 2.struct里面可以包含多个字段(属性) 3.struct类型可以定义方法,注意和函数的区分 4.strucr类型是值类型 5.struct类型可以嵌套 6. ...
- Go part 5 结构体,方法与接收器
结构体 结构体定义 结构体的定义只是一种内存布局的描述(相当于是一个模板),只有当结构体实例化时,才会真正分配内存空间 结构体是一种复合的基本类型,通过关键字 type 定义为 自定义 类型后,使结构 ...
- go结构体的方法和普通函数
package main import ( "fmt" "math" ) type vertex struct { X, Y float64 } //值接收者是 ...
- go 结构体与方法
go 结构体与方法 go 结构体相当于 python 中类的概念,结构体用来定义复杂的数据结构,存储很多相同的字段属性 结构体的定义 1.结构体的定义以及简单实用 package main imp ...
- go结构体与方法
go结构体相当于python中类的概念 结构体用来定义复杂的数据结构,存储很多相同的字段属性 1.结构体的定义以及简单实用 package main import ( "fmt" ...
- Go 语言 结构体和方法
@ 目录 1. 结构体别名定义 2. 工厂模式 3. Tag 原信息 4. 匿名字段 5. 方法 1. 结构体别名定义 变量别名定义 package main import "fmt&quo ...
- Go基础之--结构体和方法
结构体的定义 结构体是将零个或者多个任意类型的命令变量组合在一起的聚合数据类型.每个变量都叫做结构体的成员. 其实简单理解,Go语言的结构体struct和其他语言的类class有相等的地位,但是GO语 ...
- go的基结构体如何使用派生结构体的方法
将派生类的方法声明为接口嵌入到基结构体中,派生结构体声明该接口为自身.
- Go语言 6 结构体、方法和接口
文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ Go学习群:415660935 结构体(struct)是由一系列具有相同类型或不同类 ...
随机推荐
- Nginx笔记02-nginx常用参数配置说明
nginx的主配置文件是nginx.conf,这里主要针对这个文件进行说明 1.主配置文件nginx.conf 2.nginx配置文件的结构 从上面的配置文件中我们可以总结出nginx配置文件的基 ...
- java应用简单递归
毕业后就怎么学过算法,还在上学的时候学过数据结构,现在基本上都还给老师了,可惜老师学费没有还给我... 情景: 类似于给定一个数字,算他由多少个数字组成,比如:36 现在有10.5.1 ,那么最佳帅3 ...
- Alpha阶段第2周/共2周 Scrum立会报告+燃尽图 05
作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2287] 版本控制:https://git.coding.net/liuyy08 ...
- json to xml
/* This work is licensed under Creative Commons GNU LGPL License. License: http://creativecommons.or ...
- es6 中的generator函数控制流程
Generator函数跟普通函数的写法有非常大的区别: 一是,function关键字与函数名之间有一个星号: 二是,函数体内部使用yield语句,定义不同的内部状态(yield在英语里的意思就是“产出 ...
- web程序2
.
- JavaScript decodeURI()与decodeURIComponent() 使用与区别
decodeURI()定义和用法:decodeURI()函数可对encodeURI()函数编码过的URI进行解码.语法:decodeURI(URIstring)参数描述:URIstring必需,一个字 ...
- socket编程---SCTP
sctp_sndrcvinfo结构体 sctp_event_subscribe结构体 更多的关于SCTP的结构体http://aisxyz.iteye.com/blog/2408978 SCTP套接字 ...
- Javascript 中 switch case 等于 (== )还是 恒等于(===)?
Javascript 中 switch case 等于 (== )还是 恒等于(===)? 可以测试一下以下代码,这个 case 中是 等于(==)还是恒等于(===) <script> ...
- Window 查看端口进程使用
1. 查看所有端口占用 netstat -ano 2. 查看指定端口占用 netstat -ano | findstar "8080" 其中11152 对应为进程号 3. 查看进程 ...