> go语言中结构体,就是字段的集合,类似面向对象中的类。
[TOC]
## 定义结构体
> 语法
~~~
type 结构体名称 struct {
字段集合
}
~~~
> 如下
~~~
type Book struct {
title string
author string
}
~~~
## 结构体初始化
~~~
// 方式1:按顺序初始化字段值
book := Book{"Go 语言", "xk"}
// 方式2:指定字段初始化(推荐)
book2 := Books{title: "Go 语言", author: "wx"}
// 忽略的字段为0 或 空
book3 := Books{title: "Go 语言"}
// 字段的读写
book2.title = "new book"
fmt.Println(book2.title)
~~~
## 结构体方法
> 结构体可以拥有方法(函数),结构体拥有方法后,结构体就类似面向对象的类。
> 结构体方法的语法:
~~~
func (结构体变量名 结构体类型) 函数名(函数参数列表) (函数返回值列表) {
函数体
}
~~~
> 例子
~~~
package main
import (
"fmt"
)
//定义Student结构体
type Student struct {
Name string
Age int
}
// 定义Student方法
func (stu *Student) SayHello() string {
return "Hello " + stu.Name
}
func (stu *Student) SetName(name string) {
stu.Name = name
}
func main() {
s1 := Student{}
s1.Name = "wangkun"
s1.SetName("jiaojiao")
fmt.Println(s1.SayHello())
}
~~~
## 结构体指针
~~~
package main
import (
"fmt"
)
type Book struct {
title string
author string
}
func main() {
book := Book{title: "go语言", author: "wk"}
// 定义了一个结构体指针
var book_pointer *Book
book_pointer = &book
// 读写结构体指针,假如修改了指针的字段,实际的引用对应的字段也变化
fmt.Println(book_pointer.title)
book_pointer.author = "jj"
fmt.Println(book)
}
~~~
## 结构体作为函数参数
> 结构体作为函数参数有两种方式:传值 和 传引用
~~~
package main
import (
"fmt"
)
type Student struct {
name string
age int
}
// 传值:调用函数时将实际参数复制一份传递到函数中,对参数的修改不会影响实际参数
func Test1(s Student) {
fmt.Println("名称:" + s.name) // 非指针的类型引用,只能用来读取操作
// 当传入的参数不是指针类型,以下修改操作不生效
s.name = "wk"
s.age = 22
}
// 传引用:调用函数时将实际参数的地址直接传递到函数中,对参数进行修改,将影响到实际参数。
func Test2(s *Student) {
s.name = "wk"
s.age = 22
}
func main() {
student := Student{name: "init", age: 0}
Test1(student)
fmt.Println(student) //输出结果:{init 0}
Test2(&student)
fmt.Println(student) //输出结果:{wk 22}
}
~~~
## 嵌套结构体
> 结构体字段类型可以是结构体类型
~~~
package main
import "fmt"
// 定义UserInfo结构体类型
type UserInfo struct {
Id int
Username string
}
// 定义Order结构体
type Order struct {
Id int
User UserInfo // User字段的类型是UserInfo结构体类型
}
func main() {
// 初始化结构体
o := Order{}
o.Id = 100
// 通过UserInfo结构体初始化User字段
o.User = UserInfo{Id: 1, Username: "wk"}
// 打印字段值
fmt.Println(o.Id)
fmt.Println(o.User.Id)
fmt.Println(o.User.Username)
}
~~~
- 基础知识
- 开发环境
- 包名规则
- 包初始化 (init)
- 基础数据类型
- 基础类型转换
- 格式化输出
- go指针
- 流程控制语句
- 函数定义
- 匿名函数
- 数组和切片
- map集合
- 结构体
- Interface接口
- 日期处理
- 数学计算
- 正则表达式
- 协程 (并发处理)
- channel
- waitgroup
- mutex (锁机制)
- websocket
- protobuf
- Redis
- 错误处理
- 打包程序
- NSQ消息队列
- 单元测试
- beego
- 安装入门
- Gin
- 快速入门
- 路由与控制器
- 处理请求参数
- 表单验证
- 处理响应结果
- 渲染HTML模版
- 访问静态文件
- Gin中间件
- Cookie处理
- Session处理
- Gin上传文件
- swagger
- pprof性能测试
- GORM
- 入门教程
- 模型定义
- 数据库连接
- 插入数据
- 查询数据
- 更新数据
- 删除数据
- 事务处理
- 关联查询
- 属于 (BELONG TO)
- 一对一 (Has One)
- 一对多 (Has Many)
- 多对多 (Many to Many)
- 预加载 (Preloading)
- 错误处理
- 第三方常用插件
- viper 读取配置文件
- zap 高性能日志
- Nginx代理配置
- Goland 快捷键