结构体
结构体构造函数
结构体构造函数返回函数指针,节省内存拷贝开销
type person struct {
name string
age int
}
func newPerson(name string, age int) *person {
return &person{
name: name,
age: age,
}
}
func main() {
Jc := newPerson("Jc", 18)
fmt.Printf("%T\n", Jc)
fmt.Println(Jc.age, Jc.name)
}
方法和接收者
type person struct {
name string
age int
}
func newPerson(name string, age int) *person {
return &person{
name: name,
age: age,
}
}
// 方法是作用于特殊类型的函数
func (aPerson person) sing() {
fmt.Println(aPerson.name, "is sing")
}
func main() {
Jc := newPerson("Jc", 18)
Jc.sing()
fmt.Printf("%T\n", Jc)
fmt.Println(Jc.age, Jc.name)
}
标识符大写
Go语言中标识符如果是大写的,说明是包中的公有成员,对外部包可见、暴露的。
Go语言中要求对大写标识符写上注释。如:
// Person 是人类
type Person struct {
name string
age int
}
方法的接收者传递方式
方法的接收者是以拷贝的形式传递的,如果想修改接收者的成员,需要传递指针。
func (aPerson *person) growing() {
aPerson.age++
}
func main() {
Jc := newPerson("Jc", 18)
fmt.Println(Jc.age, Jc.name)
Jc.growing()
fmt.Println(Jc.age, Jc.name)
}
给自定义类型定义方法
package main
import "fmt"
// 给自定义类型 定义方法
type myString string
func (ms myString) myStringFunc() {
fmt.Printf("myString func\n")
}
func main() {
var myString myString = "abc"
fmt.Printf("%s\n", myString)
myString.myStringFunc()
}
匿名结构体实现继承
type animal struct {
name string
}
func (a animal) run() {
fmt.Println(a.name, "is run")
}
type cat struct {
animal // 匿名结构体实现继承
age int
}
func main() {
huahua := cat{
animal: animal{"huahua"},
age: 2,
}
huahua.run()
}
json
// 结构体与json
// 序列化: 把Go中结构体转化为json字符串
// 反序列化:把json字符串,转为Go语言结构体
// 大写!才可以被外部访问,也可以用tag
type person struct {
Name string `json:"name" db:"name" init:"name"`
Age int `json:"age"`
}
func main() {
ap := person{
"Jc",
23,
}
byte, err := json.Marshal(ap)
if err != nil {
fmt.Println("err")
}
fmt.Println(string(byte))
}