学习笔记根据 无闻 go语言基础教程 整理
struct
- Go 中的struct与C中的struct非常相似,并且Go没有class
- 使用type struct{} 定义结构,名称遵循可见性规则
- 支持指向自身的指针类型成员
- 支持匿名结构,可用作成员或定义成员变量
- 匿名结构也可以用于map的值
- 可以使用字面值对结构进行初始化
- 允许直接通过指针来读写结构成员
- 相同类型的成员可进行直接拷贝赋值
- 支持 == 与 != 比较运算符,但不支持 > 或 <
- 支持匿名字段,本质上是定义了以某个类型名为名称的字段
- 嵌入结构作为匿名字段看起来像继承,但不是继承
- 可以使用匿名字段指针
- 示例代码:
package main
import (
"fmt"
)
type person struct {
Name string
Age int
}
func main() {
test1()
test2()
test3()
test4T()
test5T()
test6T()
test7()
test8()
test9()
test10()
test11()
test12()
}
func test1() {
a := person{}
fmt.Println(a)
}
func test2() {
a := person{}
a.Name = "joe"
a.Age = 19
fmt.Println(a)
}
func test3() {
a := person {
Name: "joe",
Age: 19,
}
fmt.Println(a)
}
func test4(per person) {
per.Age = 13
fmt.Println("test4",per)
}
func test4T() {
a := person{
Name:"joe",
Age:19,
}
fmt.Println(a)
test4(a)
fmt.Println(a)
}
func test5(per *person) {
per.Age = 13
fmt.Println("test4",per)
}
func test5T() {
a := person{
Name:"joe",
Age:19,
}
fmt.Println(a)
test5(&a)
fmt.Println(a)
}
func test6(per *person) {
per.Age = 13
fmt.Println("test4",per)
}
func test6T() {
a := &person{
Name:"joe",
Age: 19,
}
fmt.Println(a)
test6(a)
fmt.Println(a)
}
func test7() {
a := struct {
Name string
Age int
}{
Name:"joe",
Age: 19,
}
fmt.Println(a)
}
func test8() {
a := &struct {
Name string
Age int
}{
Name:"joe",
Age: 19,
}
fmt.Println(a)
}
func test9() {
type person struct {
Name string
Age int
Contact struct {
Phone, City string
}
}
a := person{
Name:"joe",
Age:19,
}
a.Contact.Phone = "123"
a.Contact.City = "Bj"
fmt.Println(a)
}
func test10() {
type person struct {
string
int
}
a := person{"joe",19}
fmt.Println(a)
}
func test11() {
a := person{Name:"joe", Age: 19}
var b person
b = a
a.Age = 20
fmt.Println(a)
fmt.Println(b)
}
func test12() {
type teacher struct {
person
Class , Grade string
}
a := teacher{person:person{Name:"a", Age:29} , Class:"c1", Grade:"g1"}
fmt.Println(a)
a.Class = "c3"
a.Grade = "g3"
a.person.Name = "aa"
a.Age = 30
fmt.Println(a)
}