结构体是由一些列属性组成的复合数据类型,每个数据都具有名称,结构体将属性组合在一起进行由程序进行处理
1、自定义类型
在Go语言中使用type声明一种新的类型,语法格式:
type TypeName Formatter
package mainimport "fmt"// Counter 见类型知含义 & 可以添加方法// Counter 现有数据类型type Counter inttype User map[string]stringtype Callback func() errorfunc main() {var counter Counterfmt.Printf("%T,%v\n", counter, counter) // main.Counter,0counter += 10fmt.Printf("%T,%v\n", counter, counter) // main.Counter,10s2 := Counter(20) + counter //类型转换fmt.Printf("%T,%v\n", s2, s2) // main.Counter,30var 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 mainimport ("fmt")type Counter = int // 别名func main() {var counter Counterfmt.Printf("%T,%v\n", counter, counter) // int,0var num int = 10fmt.Println(num + counter) // 10}
3、结构体
package mainimport ("fmt""time")// User 定义结构体type User struct {id intname stringaddr stringtel stringbirthday 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 = 100user.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 mainimport ("fmt""time")// User 定义结构体type User struct {id intname stringaddr stringtel stringbirthday 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 mainimport ("fmt""time")func main() {// 匿名结构体var user struct {id intname stringtel stringaddr stringbirthday 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 intname stringtel stringaddr stringbirthday 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 intname stringtel stringaddr stringbirthday 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 intname 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 mainimport ("fmt""time")type Addr struct {province stringstreet stringnumbe string}type Tel struct {prefix stringnumber string}// User 组合type User struct {id intname stringtel Teladdr Addrbirthday 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) // 北京市}
