mirror of
https://gitee.com/shikong-sk/golang-study
synced 2025-02-23 23:42:15 +08:00
93 lines
2.2 KiB
Go
93 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// 结构体
|
|
// Golang 中 通过 struct 实现面向对象
|
|
// 结构体 是 值类型
|
|
|
|
type Person struct {
|
|
Age int
|
|
Name string
|
|
Gender string
|
|
Hobby []string
|
|
}
|
|
|
|
// golang 中 函数参数都是副本
|
|
func change(p Person) {
|
|
// 修改 的是 副本的 Gender
|
|
p.Gender = "女"
|
|
}
|
|
|
|
func change2(p *Person) {
|
|
// 根据内存地址 找到 原变量 并修改
|
|
// (*p).Gender = "女"
|
|
|
|
// 语法糖 自动根据指针找到变量
|
|
p.Gender = "女"
|
|
}
|
|
|
|
func main() {
|
|
// 声明一个 person 类型的变量
|
|
var p1 Person
|
|
// 通过字段赋值
|
|
p1.Name = "于谦"
|
|
p1.Age = time.Now().Year() - 1969
|
|
p1.Gender = "男"
|
|
p1.Hobby = []string{"抽烟", "喝酒", "烫头"}
|
|
// 访问 Name 字段
|
|
fmt.Println(p1.Name)
|
|
fmt.Printf("type: %T value: %#v\n", p1, p1)
|
|
|
|
// 匿名结构体 一般用于临时场景
|
|
var s struct {
|
|
name string
|
|
age int
|
|
}
|
|
|
|
s.name = "s"
|
|
s.age = 100
|
|
fmt.Printf("type: %T value: %#v\n", s, s)
|
|
|
|
fmt.Println("=========================================================")
|
|
|
|
change(p1)
|
|
fmt.Printf("type: %T value: %#v\n", p1, p1)
|
|
|
|
change2(&p1)
|
|
fmt.Printf("type: %T value: %#v\n", p1, p1)
|
|
|
|
fmt.Println("=========================================================")
|
|
|
|
var p2 = new(Person)
|
|
(*p2).Name = "person2"
|
|
p2.Age = 10086
|
|
fmt.Printf("type: %T value: %#v\n", p2, p2)
|
|
fmt.Printf("内存地址: %p\n", p2)
|
|
fmt.Printf("p2 的 内存地址: %p\n", &p2)
|
|
|
|
fmt.Println("=========================================================")
|
|
|
|
// 声明并初始化 结构体
|
|
var p3 = Person{Name: "张三", Gender: "男"}
|
|
fmt.Printf("type: %T value: %#v\n", p3, p3)
|
|
|
|
// 使用值列表的形式初始化 结构体
|
|
// 值的 顺序 要和 结构体定义的 字段顺序 一致
|
|
var p4 = Person{20, "李四", "男", []string{}}
|
|
fmt.Printf("type: %T value: %#v\n", p4, p4)
|
|
|
|
fmt.Println("=========================================================")
|
|
// 声明并初始化 结构体 指针 (常用)
|
|
var p5 = &Person{Name: "王五", Gender: "男"}
|
|
fmt.Printf("type: %T value: %#v\n", p5, p5)
|
|
|
|
// 使用值列表的形式初始化 结构体指针
|
|
// 值的 顺序 要和 结构体定义的 字段顺序 一致
|
|
var p6 = &Person{20, "赵六", "男", []string{}}
|
|
fmt.Printf("type: %T value: %#v\n", p6, p6)
|
|
}
|