go-struct
type Person struct {
Name string //字段
Age int //字段
Score float32
}
1.var person Person
2.var person Person =Person{}
p2 := Person{"malina", 20}
p2.Name
3.var p3 *Person=new(Person)
(*p3).Name = "ssss"
p3.Name = "hh"
4.var person *Person=&Person{}
(*person).Name = "ssss"
person.Name = "hh"
1) 第 3 种和第 4 种方式返回的是 结构体指针。
2) 结构体指针访问字段的标准方式应该是:(结构体指针).字段名 ,比如 (person).Name = “tom”
3) 也支持 结构体指针.字段名,
比如 person.Name = “tom”。更加符合程序员
使用的习惯,go 编译器底层 对 person.Name 做了转化 (*person).Name。
var p1 Person
p1.Age = 10
p1.Name="小米"
var p2 *Person = &p1
fmt.Println((*p2).Age)
fmt.Println(p2.Age)
p2.Name = "tom"
fmt.Printf("p2.name=%v p1.name=%v\n", p2.Name, p1.Name)
fmt.Printf("p2.name=%v p1.name=%v\n", (*p2).Name, p1.Name)
fmt.Printf("p1地址%p\n", &p1)
fmt.Printf("p2的地址%p p2的值%p", &p2, p2)
运行结果:
10
10
p2.name=tom p1.name=tom
p2.name=tom p1.name=tom
p1地址0xc0000ac018
p2的地址0xc0000b4018 p2的值0xc0000ac018
struct 的每个字段上,可以写上一个 tag, 该 tag 可以通过反射机制获取,常见的使用场景就是序
列化和反序列化。
type m struct {
Name string `json:"name"`
Age int `json:"age"`
Skill string `json:"skill"`
}
func main() {
m := m{"牛", 500, "火焰山"}
jsonStr, err := json.Marshal(m)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(jsonStr))
}
{"name":"牛","age":500,"skill":"火焰山"}
type A struct {
Num int
}
func (a A) test() {
fmt.Println(a.Num)
}
1) func (a A) test() {}
表示 A 结构体有一方法,方法名为 test
2) (a A) 体现 test 方法是和 A 类型绑定的
接收者为值类型时,不能把指针类型的数据直接传递
func test01(p Person) {
fmt.Println(p.Name)
}
func test02(p *Person) {
fmt.Println(p.Name)
}
func main() {
p := Person{"tom"}
test01(p)
test02(&p)
}
tom
tom
func (p Person) test03() {
p.Name = "jack"
fmt.Println(p.Name)
}
func (p *Person) test04() {
p.Name = "mary"
fmt.Println(p.Name)
}
func main() {
p := Person{"tom"}
p.test03()
fmt.Println(p.Name)
(&p).test03()//从形式上是传入地址,本质还是值拷贝
fmt.Println(p.Name)
(&p).test04()
fmt.Println(p.Name)
p.test04()//形式上是值类型,本质是地址拷贝
fmt.Println(p.Name)
}
//真正决定是值拷贝还是地址拷贝,看这个方法是和哪个类型绑定
//(p Person) , 则是值拷贝, 如果和指针类型,比如是 (p *Person) 则是地址拷贝
本作品采用《CC 协议》,转载必须注明作者和本文链接