Golang 学习笔记05-结构体基础

结构体

类似于js的类,关键字type

type 结构体名称 struct{
    名称 类型//成员或属性
}
package main

import "fmt"

type Student struct {
	Name string
}

func (s Student) Study() {
	fmt.Printf("%s 正在学习\n", s.Name)
}
func main() {
	//	结构体
	s1 := Student{Name: "张三"}
	s1.Study()
}

组合

类似继承,直接写需要组合的结构体

type Person struct {
    Name string
}

type Student struct {
    Person
    Name string
}
package main

import "fmt"

type Person struct {
	Name string
}

type Student struct {
	Person
	Name string
}

func (s Student) Info() {
	fmt.Printf("姓名%s 性别%s \n", s.Name, s.Person.Name) //因为这里的Name冲突了。所以这里要加上Person.Name
}

func (s Student) Study() {
	fmt.Printf("%s 正在学习\n", s.Name)
}
func main() {
	//	结构体
	// 父类实例化
	p1 := Person{Name: "男生"}
	//子类实例化
	s1 := Student{Person: p1, Name: "张三"}
	s1.Study()
	s1.Info()
}
张三 正在学习
姓名张三 性别男生

结构体指针

func (s Student) SetName(name string) {
	s.Name = name
}
func main() {
	s1.SetName("李四")
	s1.Info()
}
姓名张三 性别男生

这时候发现name并没有被修改成功,这时候需要把指针放到Student

func (s *Student) SetName(name string) {
	s.Name = name
}

结构体tag

type User struct {
	Name     string
	Age      int
	Password string
}

func main() {
	user := User{Name: "张三", Age: 18, Password: "123456"}
	// 这里的_ 表示忽略错误
	byteData, _ := json.Marshal(user)
	fmt.Println(string(byteData))
}
{"Name":"张三","Age":18,"Password":"123456"}

这里输出的是json,但是一般json文件是小驼峰

type User struct {
	Name     string `json:"name"`
	Age      int    `json:"age"`
	Password string `json:"-"` //这里表示不需要转
}

func main() {
	user := User{Name: "张三", Age: 18, Password: "123456"}
	// 这里的_ 表示忽略错误
	byteData, _ := json.Marshal(user)
	fmt.Println(string(byteData))
}
{"name":"张三","age":18}

如果实例化的时候没有传参数,输出的值是初始化值

user := User{Name: "张三", Password: "123456"}
{"name":"张三","age":0}
type User struct {
	Name     string `json:"name"`
	Age      int    `json:"age,omitempty"` //忽略空值
	Password string `json:"-"`             //这里表示不需要转
}