go struct 结构体简单总结

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) // 解引用
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值