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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!