1.自定義類型
package main
import "fmt"
type Counter int
type users map[string]string
type Callback func(...string)
//後面可以跟任意類型
func main() {
var age Counter
fmt.Println(age)
age = 200
fmt.Println(age)
me := make(users)
me["name"] = "aa"
me["addr"] = "北京"
fmt.Printf("%T %T\n", age, me)
var age2 int = 1
//定義過的類型不能跟其他類型直接比較 需要做類型轉換纔可以作比較
fmt.Println(age > Counter(age2))
fmt.Println(int(age) > age2)
//簽名必須相同
var list Callback = func(args ...string) {
for index, v := range args {
fmt.Println(index, v)
}
}
list("a", "b", "c")
}
2. 定義&聲明&初始化&New函數
結構體定義使用 struct 標識,需要指定其包含的屬性(名和類型),在定義結構體時可以爲 結構體指定結構體名(命名結構體),用於後續聲明結構體變量使用
package main
import (
"fmt"
"time"
)
//結構體的零值並不是nil 而是所有子元素的零值 組成的
type Users struct {
ID int
name string
tel int
bir time.Time
}
func main() {
var user Users
fmt.Printf("%T\n", user)
fmt.Printf("%#v\n", user)
//字面量初始化
//根據順序填寫,少一個都會報錯
var user2 Users = Users{5, "aa", 192168, time.Now()}
fmt.Printf("%#v\n", user2)
//零值初始化
var user3 Users = Users{}
fmt.Printf("%#v\n", user3)
//用指定屬性名 賦值 可以省略一部分值也可以 更換賦值順序
//如果使用這種方法定義切記最後一個也需要加逗號 不然會報錯
var user4 Users = Users{
name: "aa",
ID: 5,
}
fmt.Printf("%#v\n", user4)
//定義一個結構體的指針類型 定義不初始化 是nil
var pointer1 *Users
fmt.Printf("%T\n", pointer1)
fmt.Printf("%#v\n", pointer1)
//初始化值 定義一箇中間變量獲取它的指針進行賦值
var pointer2 *Users = &user2
fmt.Printf("%T\n", pointer2)
fmt.Printf("%#v\n", pointer2)
//初始化零值 是返回所有元素的零值
var pointer3 *Users = &Users{}
fmt.Printf("%T\n", pointer3)
fmt.Printf("%#v\n", pointer3)
//new創建一個類型的指針類型
var pointer4 *Users = new(Users)
fmt.Printf("%T\n", pointer4)
fmt.Printf("%#v\n", pointer4)
fmt.Println(pointer4.ID)
fmt.Println((*pointer4).ID)
//new是獲取一個指針 map根slice 映射和切片一般用make 引用類型
var aaa *int = new(int)
fmt.Printf("%T\n", aaa)
fmt.Printf("%#v\n", aaa)
}
3.屬性的訪問和修改
package main
import (
"fmt"
)
type User struct {
ID int
name string
tel int
}
func main() {
var user User = User{
name: "aa",
ID: 5,
tel: 192168,
}
fmt.Println(user.name, user.ID, user.tel)
user.tel = 1111111
fmt.Println(user.name, user.ID, user.tel)
user2 := &User{
name: "aa",
ID: 5,
tel: 192168,
}
fmt.Println(*user2)
//2種修改方法都可以,直接拿指針. 他背後也是解引用 然後修改
(*user2).tel = 12
user2.ID = 6
fmt.Println(*user2)
}
4.匿名結構體
在定義變量時將類型指定爲結構體的結構,此時叫匿名結構體。匿名結構體常用於初始化一
次結構體變量的場景
package main
import "fmt"
func main() {
//匿名結構體
var user struct {
ID int
name string
tel int
}
fmt.Printf("%T\n", user)
fmt.Printf("%#v\n", user)
user.ID = 222
fmt.Printf("%#v\n", user)
user2 := struct {
ID int
name string
tel int
}{1, "aa", 123456}
//這裏也可以使用命名 xxx:x
fmt.Printf("%#v\n", user2)
}