Go入门之struct

类型别名

Go 复制代码
var b myFloat = 12.3
	fmt.Printf("%f,%T", b, b)

结构体为值类型

初始化

Go 复制代码
type Person struct {
	name string
	age  int
	sex  string
}

func main() {
	var p1 Person
	p1.name = "张三"
	p1.sex = "男"
	p1.age = 20
	fmt.Printf("%v,%T\n", p1, p1)
	fmt.Printf("%#v,%T\n", p1, p1)

}

结构体首字母大写表示是公有的,小写表示是私有的

第二种

Go 复制代码
	var p2 = new(Person)
	fmt.Printf("%v,%T\n", p2, p2)

第三种

Go 复制代码
    var p3 = &Person{}
	fmt.Printf("%v,%T\n", p3, p3)

第四种

Go 复制代码
var p4 = Person{
		name: "哈哈",
		age:  20,
		sex:  "nan",
	}
	fmt.Printf("%v,%T\n", p4, p4)

第五种

Go 复制代码
var p5 = &Person{
		name: "哈哈",
		age:  20,
		sex:  "nan",
	}
	fmt.Printf("%v,%T\n", p5, p5)

第六种初始化可以不赋值,为默认值

结构体自定义方法

Go 复制代码
type Person struct {
	name string
	age  int
	sex  string
}

func (p Person) PrintInfo() {
	fmt.Printf("%v,%v", p.name, p.age)
}
func main() {
	var p1 = Person{
		name: "张三",
		age:  20,
		sex:  "男",
	}
	p1.PrintInfo()
}

自定义类型定义方法

Go 复制代码
type MyInt int

func (m MyInt) PrintInfo() {
	fmt.Println("int")
}

不能给其他包的类型定义方法

匿名结构体

Go 复制代码
type student struct {
	string
	int
}

func main() {
	p := student{
		"张三",
		20,
	}
	fmt.Println(p)
}
Go 复制代码
type Address struct {
	Phone string
	City  string
}
type Person struct {
	Name  string
	Age   int
	Hobby []string
	map1  map[string]string
	addr  Address
}

func main() {
	var p Person
	p.Name = "张三"
	p.Age = 20
	p.Hobby = make([]string, 3, 6)
	p.Hobby[0] = "写代码"
	p.Hobby[1] = "睡觉"
	p.map1 = make(map[string]string)
	p.map1["address"] = "北京"
	p.addr.City = "北京"
	p.addr.Phone = "12312"
	fmt.Println(p)
}

匿名字段在嵌套结构体中的应用,如果当前找不到就向匿名嵌套结构体中寻找

Go 复制代码
type Address struct {
	Phone string
	City  string
}
type Person struct {
	Name  string
	Age   int
	Hobby []string
	map1  map[string]string
	Address
}

func main() {
	var p Person
	p.Name = "张三"
	p.Age = 20
	p.Hobby = make([]string, 3, 6)
	p.Hobby[0] = "写代码"
	p.Hobby[1] = "睡觉"
	p.map1 = make(map[string]string)
	p.map1["address"] = "北京"
	p.City = "北京"
	p.Phone = "12312"
	fmt.Println(p)
}

通过结构体嵌套来继承结构体及其方法,当前没有方法,去嵌套结构体找

Go 复制代码
type Student struct {
	ID     int
	Gender string
	Name   string
	Sno    string
}

func main() {
	var s1 = Student{
		ID:     12,
		Gender: "男",
		Name:   "李四",
		Sno:    "123",
	}
	jsonByte, _ := json.Marshal(s1)
	jsonStr := string(jsonByte)
	fmt.Printf("%v", jsonStr)
}

结构体转换成json对象,变量必须为大写,表示公有字段

json对象转结构体

Go 复制代码
type Student struct {
	ID     int
	Gender string
	Name   string
	Sno    string
}

func main() {
	var str = `{"ID":12,"Gender":"男","Name":"李四","Sno":"123"}`
	var s1 Student
	err := json.Unmarshal([]byte(str), &s1)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Printf("%#v\n", s1)
}

结构体标签:转换完自动变成该变量

Go 复制代码
type Student struct {
	ID     int    `json:"id"`
	Gender string `json:"gender"`
	Name   string `json:"name"`
	Sno    string `json:"sno"`
}
Go 复制代码
type Student struct {
	ID     int    `json:"id"`
	Gender string `json:"gender"`
	Name   string `json:"name"`
}
type Class struct {
	Title    string
	Students []Student
}

func main() {
	c := Class{
		Title:    "001班",
		Students: make([]Student, 0),
	}
	for i := 0; i <= 10; i++ {
		s := Student{
			ID:     i,
			Gender: "男",
			Name:   fmt.Sprintf("std_%v", i),
		}
		c.Students = append(c.Students, s)
	}
	fmt.Println(c)
	strByte, err := json.Marshal(c)
	if err != nil {
		fmt.Println(err)
	} else {
		strJson := string(strByte)
		fmt.Println(strJson)
	}
}
Go 复制代码
	var str = `{"Title":"001班","Students":[{"id":0,"gender":"男","name":"std_0"},{"id":1,"gender":"男","name":"std_1"},{"id":2,"gender":"男","name":"std_2"},{"id":3,"gender":"男","name":"std_3"},{"id":4,"gender":"男","name":"std_4"},{"id":5,"gender":"男","name":"std_5"},{"id":6,"gender":"男","name":"std_6"},{"id":7,"gender":"男","name":"std_7"},{"id":8,"gender":"男","name":"std_8"},{"id":9,"gender":"男","name":"std_9"},{"id":10,"gender":"男","name":"std_10"}]}`
	var cc = &Class{}
	errr := json.Unmarshal([]byte(str), cc)
	if errr != nil {
		fmt.Println(errr)
	} else {
		fmt.Printf("%#v", cc)
	}
相关推荐
我不会起名字3227 小时前
会话缓存失效排查:区分 Redis 失效与节点广播
redis·后端·go·即时通讯·im·故障排查
深入云栈9 小时前
Netty 4.2.x 源码深度解析 (二十三):ByteBuf 核心设计 —— 索引、类型与零拷贝
java·后端·架构
JackJiang9 小时前
IM踩坑:聊天消息ID怎么设计?一个UUID搞不定,我用双ID解决
后端·架构
开心猴爷9 小时前
iOS 上架 App 流程
后端·ios
爱笑的k119 小时前
nano-vllm 源码剖析:千行 Python 手写离线推理引擎的调度、显存与并行时序
开发语言·python·vllm
code_Bo9 小时前
不只命令行:我把跨 Agent 会话同步做成了桌面应用
前端·javascript·后端
用户83562907805110 小时前
使用 Python 控制 Excel 工作表的分页位置
后端·python
用户83562907805110 小时前
Python 如何在 Word 中添加和管理文档变量
后端·python
X1A0RAN10 小时前
PPT 图片批量处理教程:导出全部幻灯片 · 提取全部素材
开发语言·javascript·powerpoint
量化分析码农11 小时前
股票历史数据的复权参数对照:多级别返回的字段与数值差异
java·javascript·后端