方法和函数的区别
Go语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。接收者的概念就类似于其他语言中的this或者 self。
func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {
函数体
}
- 接收者变量:接收者中的参数变量名在命名时,官方建议使用接收者类型名称首字母的小写,而不是self、this之类的命名。例如,Person类型的接收者变量应该命名为 p,Connector类型的接收者变量应该命名为c等。
- 接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型。
- 方法名、参数列表、返回参数:具体格式与函数定义相同。
//Person 结构体
type Person struct {
name string
age int8
}
//NewPerson 构造函数
func NewPerson(name string, age int8) *Person {
return &Person{
name: name,
age: age,
}
}
//Dream Person做梦的方法
func (p Person) Dream() {
fmt.Printf("%s的梦想是学好Go语言!\n", p.name)
}
func main() {
p1 := NewPerson("小王子", 25)
p1.Dream()
}
方法与函数的区别是,函数不属于任何类型,方法属于特定的类型。
结构体字段的可见性
结构体中字段大写开头表示可公开访问,小写表示私有(仅在定义当前结构体的包中可访问)。
结构体模拟继承
Golang语言没有继承概念,只能通过struct嵌套struct模拟实现
package main
import "fmt"
type animal struct {
habitat0 string //栖息地
life0 int //寿命
eat0 string //生存方式
}
func newAnimal(habitat, eat string, life int) *animal {
return &animal{
habitat0: habitat,
eat0: eat,
life0: life,
}
}
func (a *animal) move() { //animal的方法
fmt.Println("动物都可以动")
}
type human struct {
humanAnimal *animal
idcard string
telephone string
jobs string
}
func (h *human) think() {
fmt.Println("人可以思考!")
}
type dog struct {
dogAnimal *animal
about string
}
func main() {
var wangcai = dog{
about: "人类的朋友",
}
//旺财调用animal的方法
wangcai.dogAnimal = newAnimal("家养", "杂食", 10)
var xiaoming = human{
idcard: "1234567890",
telephone: "110",
jobs: "码农",
}
xiaoming.humanAnimal = newAnimal("地球", "杂食", 100)
//旺财的行为
wangcai.dogAnimal.move()
//小明的行为
xiaoming.humanAnimal.move()
xiaoming.think()
}
结构体与JSON序列化
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON键值对是用来保存JS对象的一种方式,键/值对组合中的键名写在前面并用双引号""包裹,使用冒号:分隔,然后紧接着值;多个键值之间使用英文,分隔。
package main
import (
"encoding/json"
"fmt"
)
// Student json包需要使用Student去Marshal
type Student struct {
ID int `json:"id"`
Name string `json:"name"`
Score int `json:"score"`
}
func main() {
s := &Student{
ID: 1,
Name: "校长",
Score: 100,
}
data, err := json.Marshal(s)
if err != nil {
fmt.Printf("json.Marshal error\n")
}
fmt.Printf("%#v\n", string(data))
str := string(data)
var student = &Student{}
ok := json.Unmarshal([]byte(str), student)
if ok != nil {
fmt.Printf("json.Unmarshal error\n")
}
fmt.Printf("%v\n", *student)
}