结构体是由一些列属性组成的复合数据类型,每个数据都具有名称,结构体将属性组合在一起进行由程序进行处理
1、自定义类型
在Go语言中使用type声明一种新的类型,语法格式:
type TypeName Formatter
package main
import "fmt"
// Counter 见类型知含义 & 可以添加方法
// Counter 现有数据类型
type Counter int
type User map[string]string
type Callback func() error
func main() {
var counter Counter
fmt.Printf("%T,%v\n", counter, counter) // main.Counter,0
counter += 10
fmt.Printf("%T,%v\n", counter, counter) // main.Counter,10
s2 := Counter(20) + counter //类型转换
fmt.Printf("%T,%v\n", s2, s2) // main.Counter,30
var user User = make(User)
fmt.Printf("%T,%v\n", user, user) // main.User,map[]
user["id"] = "1"
fmt.Println(user) // map[id:1]
callback := map[string]Callback{}
callback["add"] = func() error {
fmt.Println("add")
return nil
}
callback["add"]() // add
}
2、别名
package main
import (
"fmt"
)
type Counter = int // 别名
func main() {
var counter Counter
fmt.Printf("%T,%v\n", counter, counter) // int,0
var num int = 10
fmt.Println(num + counter) // 10
}
3、结构体
package main
import (
"fmt"
"time"
)
// User 定义结构体
type User struct {
id int
name string
addr string
tel string
birthday time.Time
}
func main() {
var user User
// 零值是由个元素的零组成的一个结构体的变量
fmt.Printf("%T,%v\n", user, user) // main.User,{0 {0 0 <nil>}}
// 字面量(按照属性顺序定义的字面量)
// 必须严格按照结构体属性定义顺序
// 每个属性都必须指定
user = User{10, "dadong", "北京", "123456789", time.Now()}
fmt.Printf("%#v\n", user) // main.User{id:10, name:"dadong", addr:"北京", tel:"123456789", birthday:time.Time{wall:0xc038093d10d8df50, ext:4793801, loc:(*time.Location)(0x1eb560)}}
//按照属性名定义的字面量
user = User{id: 20, name: "xxd"}
fmt.Printf("%#v\n", user) // main.User{id:20, name:"xxd", addr:"", tel:"", birthday:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}
// 属性访问和修改
fmt.Println(user.id)
user.id = 100
user.name = "xisuo"
fmt.Printf("%#v\n", user) // main.User{id:100, name:"xisuo", addr:"", tel:"", birthday:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}
}
4、结构体指针类型
package main
import (
"fmt"
"time"
)
// User 定义结构体
type User struct {
id int
name string
addr string
tel string
birthday time.Time
}
func main() {
var user = &User{name: "dadong", id: 10}
fmt.Printf("%T,%#v\n", user, user) // *main.User,&main.User{id:10, name:"dadong", addr:"", tel:"", birthday:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}
// new函数初始化
// 初始化结构体指针
user = new(User)
fmt.Printf("%T,%#v\n", user, user) // *main.User,&main.User{id:0, name:"", addr:"", tel:"", birthday:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}
u2 := new(User)
fmt.Printf("%T,%#v\n", u2, u2) // *main.User,&main.User{id:0, name:"", addr:"", tel:"", birthday:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}
}
5、匿名结构体
package main
import (
"fmt"
"time"
)
func main() {
// 匿名结构体
var user struct {
id int
name string
tel string
addr string
birthday time.Time
}
fmt.Printf("%T,\n%#v\n", user, user)
//struct { id int; name string; tel string; addr string; birthday time.Time },
//struct { id int; name string; tel string; addr string; birthday time.Time }{id:0, name:"", tel:"", addr:"", birthday:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}
user = struct {
id int
name string
tel string
addr string
birthday time.Time
}{10, "dadong", "13500000", "xxxxxxx", time.Now()} // 结构体类型
fmt.Printf("%T,\n%#v\n", user, user)
//struct { id int; name string; tel string; addr string; birthday time.Time },
//struct { id int; name string; tel string; addr string; birthday time.Time }{id:10, name:"dadong", tel:"13500000", addr:"xxxxxxx", birthday:time.Time{wall:0xc0380e4e4475cc00, ext:4365301, loc:(*time.Location)(0xb3b560)}}
user = struct {
id int
name string
tel string
addr string
birthday time.Time
}{name: "dadong", id: 10} // 结构体类型
fmt.Printf("%T,\n%#v\n", user, user)
//struct { id int; name string; tel string; addr string; birthday time.Time },
//struct { id int; name string; tel string; addr string; birthday time.Time }{id:10, name:"dadong", tel:"", addr:"", birthday:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}
var u2 = struct {
id int
name string
}{id: 10, name: "dadong"}
fmt.Printf("%T,\n%#v\n", u2, u2)
//struct { id int; name string },
//struct { id int; name string }{id:10, name:"dadong"}
}
5.1 多层及使用
package main
import (
"fmt"
"time"
)
type Addr struct {
province string
street string
numbe string
}
type Tel struct {
prefix string
number string
}
// User 组合
type User struct {
id int
name string
tel Tel
addr Addr
birthday time.Time
}
func main() {
var user User = User{
id: 0,
name: "",
tel: Tel{
prefix: "",
number: "",
},
addr: Addr{
province: "北京市",
street: "",
numbe: "",
},
birthday: time.Now(),
}
fmt.Println(user.addr.province) // 北京市
}