创建结构体实例的四种方式
- 方式一
var person Person
- 方式二
var person Person = Person{}
- 方式三
var person *Person = new(Person)
- 方式四
var person *Person = &Person{}
说明:
第三种和第四种方式返回的是结构体指针。
结构体指针访问字段的标准方式是:
(*结构体指针).字段名,比如:
(*person).Name = "tom"
- 但go做了个简化,也支持结构体指针.字段名,比如:person.Name = "tom"。更加符合程序员使用的习惯,go编译器底层对person.Name做了转化(*person).Name。
结构体在内存中存储是连续的
package main
import (
"fmt"
)
//点结构体
type Point struct {
x int
y int
}
//结构体
type Rect struct {
leftUp, rightDown Point
}
func main (){
r1 := Rect{Point{1, 2}, Point{3, 4}}
fmt.Printf("r1.leftUp.x 地址=%p r1.leftUp.y 地址=%p
r1.rightDown.x 地址=%p r1.rightDown.y 地址=%p \n”,
&r1.leftUp.x, &r1.leftUp.y, &r1.rightDown.x, &r1.rightDown.y)
}
结构体类型相互转换
结构体是用户单独定义的类型,和其他类型进行转换时需要有完全相同的字段 名字、个数、类型
type A struct{
Num int
}
type B struct{
Num int
}
type C struct{
Num float64
}
func main(){
var a A
var b B
var c C
fmt.Println(a, b)
a = A(b)
// a = A(c) 出错!
}
结构体重定义
结构体进行重新定义(相当于取别名),Golang认为时新的数据类型,但是相互间可以强转。
type Student struct{
Name string
Age int
}
type Stu student
func main(){
var stu1 Student
var stu2 Stu
stu2 = Stu(stu1)
fmt.Println(stu1, stu2)
}
tag
struct的每个字段上,都可以写上一个tag,该tag可以通过反射机制来获取,常见的使用场景就是序列化和反序列化。
package main
import (
"fmt"
"encoding/json"
)
//Monster结构体
type Monster struct{
Name string
Age int
Skill string
}
func main() {
//创建一个Monster变量
monster := Monster{"牛魔王", 500, "芭蕉扇"}
//将monster变量序列化为json格式字符串
jsonStr, err := json.Marshal(monster)
if err != nil {
fmt.Println("json 处理错误:", err)
}
fmt.Println("jsonStr", string(jsonStr))
}
将struct变量进行json处理。
问题: json处理后的字段名也是首字母大写,这样如果我们将json后的字符串返回给其他程序使用,比如jquery
,php
等,那么可能他们不习惯这个命名方式,怎么办?
解决方案:
- 将Monster的字段首字母小写,但是这是行不通的。你会发现处理之后,返回的是空字符串,因为json.Marshal相当于在其他包访问monster结构体,你首字母小写,就不能在其他包访问。
- 使用tag。
package main
import (
"fmt"
"encoding/json"
)
//Monster结构体
type Monster struct{
Name string `json: "name"` //tag
Age int `json: age` //tag
Skill string `json: skill` //tag
}
func main() {
//创建一个Monster变量
monster := Monster{"牛魔王", 500, "芭蕉扇"}
//将monster变量序列化为json格式字符串
jsonStr, err := json.Marshal(monster)
if err != nil {
fmt.Println("json 处理错误:", err)
}
fmt.Println("jsonStr", string(jsonStr))
}