golang基础-结构体tag、匿名字段、结构体的方法(作用域)、继承、String()方法
2017-10-29 21:29
387 查看
struct中的tag
我们可以为struct中的每个字段,写上一个tag。这个tag可以通过反射的机制获取到,最常用的场景就是json序列化和反序列化
package main import "fmt" import "encoding/json" type student struct { Name string `json:"stu_name"` Age int } func main() { var stu student = student{ Name:"safly", Age:10, } data,err := json.Marshal(stu) if err != nil{ fmt.Println("json encode stu failed",err) return } fmt.Println(string(data)) }
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go {"stu_name":"safly","Age":10} PS E:\golang\go_pro\src\safly>
匿名字段
结构体中字段可以没有名字,即匿名字段package main import ( "fmt" ) type student struct { name string age int } type stu struct{ student int } func main() { var stu1 stu stu1.name = "saly" stu1.age =10 stu1.int = 100 fmt.Println(stu1) fmt.Println("---------------------") var stu2 stu stu2.name = "salyyy" stu2.age =100 stu2.int = 1000 //都设置age name时候,就看自己的 stu2.student.name = "ss" stu2.student.age = 11 fmt.Println(stu2) }
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go {{saly 10} 100} --------------------- {{ss 11} 1000} PS E:\golang\go_pro\src\safly>
方法
[b]方法作用在结构体上[/b]Golang中的方法是作用在特定类型的变量上,因此自定义类型,都可以
有方法,而不仅仅是struct
定义:func (recevier type) methodName(参数列表)(返回值列表){}
package main import ( "fmt" ) type Student struct { 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("safly",1,1) stu1 := stu.get() fmt.Println(stu1) fmt.Println(stu) }
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go {safly 1 1} { 0 0} { 0 0} PS E:\golang\go_pro\src\safly>
我们发现上例中init方法没有修改对象的值,我们接下来修改下代码如下:
/*结构体方法*/ func (p *Student) init(name string,age int ,score int){ p.Name = name p.Age = age p.Score = score fmt.Println(p) }
看看输出结果:
PS E:\golang\go_pro\src\safly> go run demo.go &{safly 1 1} {safly 1 1} {safly 1 1} PS E:\golang\go_pro\src\safly>
当然我们还可以在上例修改的基础上,在此修改如下代码
var stu Student (&stu).init("safly",1,1) stu1 := stu.get() fmt.Println(stu1) fmt.Println(stu)
结果输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go &{safly 1 1} {safly 1 1} {safly 1 1} PS E:\golang\go_pro\src\safly>
[b]方法作用在其他变量上[/b]
我们看下讲方法作用在其他的变量类型上
package main import ( "fmt" ) type mInt int func (p mInt)onInt(){ fmt.Println("p is",p) } func (p *mInt)set(b mInt){ *p = b } func main() { var a mInt =100 fmt.Println(a) a.onInt() //&a是传递内存地址值,当时如果传a //go会自动转换成内存地址来看待所以都是可以的 a.set(200) (&a).set(200) fmt.Println(a) }
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go 100 p is 100 200 PS E:\golang\go_pro\src\safly>
继承
如果一个struct嵌套了另一个匿名结构体,那么这个结构可以直接访问匿名结构体的方法,从而实现了继承。
package main import ( "fmt" ) type Car struct{ weight int name string } func (p *Car)Run(){ fmt.Println("running") } /*继承Car*/ type Bike struct{ Car lunzi int } /*继承Car*/ type Train struct{ Car } func main() { var bike Bike bike.weight = 100 bike.name = "bike" bike.lunzi = 4 fmt.Println(bike) bike.Run() fmt.Println("-------") var train Train train.weight = 111 train.name = "train" fmt.Println(train) train.Run() }
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go {{100 bike} 4} running ------- {{111 train}} running PS E:\golang\go_pro\src\safly>
String
如果一个变量实现了String()这个方法,那么fmt.Println默认会调用这个变量的String()进行输出。
package main import ( "fmt" ) type Car struct{ weight int name string } func (p *Car)Run(){ fmt.Println("running") } /*继承Car*/ type Train struct{ Car } /* 如果一个变量实现了String()这个方法, 那么fmt.Println默认会调用这个 变量的String()进行输出。 */ func (t *Train)String() string{ str:= fmt.Sprintf("name=%s weight=%d",(*t).name,(*t).weight) return str } func main() { var train Train train.weight = 1111 train.name = "train" fmt.Println(train) train.Run() fmt.Printf("%s",&train) }
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go {{1111 train}} running name=train weight=1111 PS E:\golang\go_pro\src\safly>
相关文章推荐
- Go语言中通过结构体匿名字段实现方法的继承和重载
- golang基础-反射获取(基础数据、结构体)、操作(基本类型、结构体、指针)、反射获取Tag
- Golang Go语言结构体中匿名字段暴露方法的优先级
- Golang初级系列教程-结构体匿名字段-Anonymous fields in structs
- Golang继承中字段及方法的测试
- Golang中匿名组合实现伪继承的方法
- 在gridview里对日期字段设置dataformatstring="{0:yyyy-MM-dd}"没有任何作用的解决方法
- java语言基础(28)——main方法的String[] args参数作用
- Golang 反射调用结构体属性、Tag、方法总结
- C#基础:匿名方法
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
- Java多继承方法(名)冲突和成员内部类、局部内部类、静态内部类、匿名内部类
- ANSI C中取得结构体字段偏移量的常用方法
- java基础知识回顾之---java String final类构造方法
- String 类的重要方法与字段
- C#基础之匿名方法实例教程
- 重写成员“MySql.Data.Entity.MySqlConnectionFactory.CreateConnection(System.String)”时违反了继承安全性规则。重写方法的安全可访问性必须与所重写方法的安全可访问性匹配。
- OC基础:继承.初始化方法,便利构造器
- [C#] C# 基础回顾 - 匿名方法
- Golang 父子对象与JSON互相转换以及struct结构体内部的反引号该如何定义字段编码生成json字符串的写法