struct : 结构体
Go语言通过首字母的大小写来控制访问权限。 无论是方法,变量,常量或是自定义的变量类型,如果首字母大写,则可以被外部包访问,反之则不可以。 而结构体中的字段名,如果首字母小写的话,则该字段无法被外部包访问和解析。
声明结构体
//声明结构体
type User struct{ // 首字母大写可以再包外访问
name string
sex string
age int
}
// 简化声明结构体
type User struct {
name,sex string
age int
}
// 匿名结构体创建(默认值同结构体)
// *再方法外需加`var`为全局匿名结构体,方法内无需加`var`.
// 个人感觉:创建出来即是一个实例,对比常规结构体缺少了一步声明
var newUser struct{
name,sex string
age int
}
// 匿名结构体 创建并赋值
var NewUser2 = struct{
name,sex string
age int
}{"小江","女",18}
struct 的创建和初始化
func main(){
var user User
fmt.Println("声明(已经默认初始化)后:",user)
fmt.Println("声明(已经默认初始化)后:",user.name)
// 感觉这个更像创建了一个匿名结构体,不过这个已有User结构体的限制
user = User{ //1 赋值时无序
name: "小名",
age: 18,
sex: "男",
}
fmt.Println("创建(赋值给声明的user)后:",user)
fmt.Println("创建(赋值给声明的user)后:",user.name)
//2 赋值时需按顺序进行
user2 := Users{"小王","女",18}
fmt.Println("创建并赋值:",user2)
// 输出:
// 声明(已经默认初始化)后: { 0}
// 创建(赋值给声明的user)后: {小名 男 18}
// 创建并赋值: {小王 女 18}
// 匿名结构体
// 匿名结构体 的赋值
newUser.name="老王"
newUser.age=88
newUser.sex="男"
newUser3 := struct {
name,sex string
age int
}{"老江","男",88}
fmt.Print("全局匿名结构体newUser:",newUser)
fmt.Println("全局匿名结构体newUser:",newUser.name)
fmt.Print("全局匿名结构体NewUser2:",NewUser2)
fmt.Println("全局匿名结构体NewUser2:",NewUser2.name)
fmt.Print("全局匿名结构体newUser3:",newUser3)
fmt.Println("全局匿名结构体newUser3:",newUser3.name)
// 输出:
// 全局匿名结构体newUser:{老王 男 88}全局匿名结构体newUser: 老王
// 全局匿名结构体NewUser2:{小江 女 18}全局匿名结构体NewUser2: 小江
// 全局匿名结构体newUser3:{老江 男 88}全局匿名结构体newUser3: 老江
}
匿名字段
结构体中允许属性字段在声明时
没有字段名而只有类型
,这种没有名字的字段就称为匿名字段
。
匿名字段默认会采用类型名作为字段名
,而结构体要求字段名称必须唯一
,因此一个结构体中同种类型的匿名字段只有一个.
type userList struct {
int
age int
string
str string
Users//匿名结构体字段,该结构体的属性字段为`提升字段`,userList实例可以像自身属性一样可以直接访问
Use Users
}
func main(){
// userOne := userList{666,18,"我是匿名属性","我不是匿名属性",Users{"小王","女",18},Users{"小王","女",16}}
user := new(userList) // 给传入函数的类型分配内存(即新建一个实例对象并分配内存初始化该对象),返回一个指向该内存地址的指针
// 赋值
user.int = 666
user.age = 18
user.string = "我是匿名属性"
user.str = "我不是匿名属性"
user.Users = Users{"小王","女",19}
// user.Use 未赋值,即默认值(零值)
// user类型可以直接访问其成员变量(结构类型)的属性
fmt.Println("user.Users.sex=",user.Users.sex) // 输出:user.Users.sex= 女
// user实例可以像自身属性一样可以直接访问
fmt.Println("user.Users.sex=",user.sex) // 输出:user.Users.sex= 女
// user实例如果有和其(匿名结构体变量)相同的属性时,需加上其变量名字
fmt.Println("user.Users.age=",user.age) // 输出:user.Users.age= 18
fmt.Println("user.Users.age=",user.Users.age) // 输出:user.Users.age= 19
// 创建一个 指向结构体的指针
u := &Users{"小王","女",18}
fmt.Println(u.name) // 指针类型直接可以访问属性,不需要显式的`解引用`
fmt.Println((*u).name) // 解引用
}