1.可见性
结构体首字母大写则包外可见(公开的),否者仅包内可访问(内部的)
结构体属性名首字母大写包外可见(公开的),否者仅包内可访问(内部的)
组合:
⚫ 结构体名首字母大写,属性名大写:结构体可在包外使用,且访问其大写的属性名
⚫ 结构体名首字母大写,属性名小写:结构体可在包外使用,且不能访问其小写的属性名
⚫ 结构体名首字母小写,属性名大写:结构体只能在包内使用,属性访问在结构体嵌入时
由被嵌入结构体(外层)决定,被嵌入结构体名首字母大写时属性名包外可见,否者只能
在包内使用
⚫ 结构体名首字母小写,属性名小写:结构体只能在包内使用
(1)user.go
package users
type ddr struct {
on int
No int
}
//大写在包外可以访问 小写包外不可以访问 匿名有一种情况特殊因为它可以省略名字
//命名and 命名嵌入
//结构体的可见性 结构体名称如果开头小写 则包可见 大写则对外可见
//结构体内部元素开头大写则包外可见 小写则包内可见
type Users struct {
ID int
Name string
bir int
ddr
}
/*
匿名嵌入S为结构体 A为结构体中的元素
S A => S => 结构体大写 包外可以创建结构体对象 属性也不可以访问
S a => S => 结构体大写 包外可以创建结构体对象 属性也不可以访问
s A => S => 结构体大写 包外可以创建结构体对象 属性也不可以访问
这种情况比较特殊 想访问在访问的时候需要省略匿名嵌入的名字直接用 结构体.匿名嵌入结构体的首字母大写的元素 是可以访问的但是要防止出现多个匿名结构体元素相同会报错的问题
s a => S => 结构体大写 包外可以创建结构体对象 属性也不可以访问
S A => s => 结构体小写 包外不可以创建结构体对象 属性也不可以访问
S a => s => 结构体小写 包外不可以创建结构体对象 属性也不可以访问
s A => s => 结构体小写 包外不可以创建结构体对象 属性也不可以访问
s A => s => 结构体小写 包外不可以创建结构体对象 属性也不可以访问
*/
(2)main.go
package main
import (
"fmt"
"virsibility/users"
)
func main() {
m := users.Users{}
fmt.Println(m)
fmt.Println(m.Name)
fmt.Println(m.No)
}
2.构造结构体
package main
import "fmt"
type Addrs struct {
Region string
Street string
}
type User struct {
ID int
Name string
Addr *Addrs
}
//可以直接定义函数调用函数返回一个结构体
func NewUser(id int, name string, region, street string) User {
return User{
ID: id,
Name: name,
Addr: &Addrs{
Region: region,
Street: street,
},
}
}
//可以直接定义函数调用函数返回一个结构体指针
func NewUserTO(id int, name string, region, street string) *User {
return &User{
ID: id,
Name: name,
Addr: &Addrs{
Region: region,
Street: street,
},
}
}
func main() {
m := NewUser(1, "aa", "北京", "宋家庄")
fmt.Printf("%#v\n", m)
m2 := NewUserTO(1, "aa", "北京", "宋家庄")
fmt.Printf("%#v\n", m2)
}