21-Golang结构体---New函数和可见性

New函数

Go 语言中常定义 new 结构体名命名的函数用于创建对应的结构体值对象或指针对象。

package main

import "fmt"

// 定义Address结构体
type Address struct {
    Region string
    Street string
    Number string
}

// 定义User结构体
type User struct {
    ID   int
    Name string
    Addr *Address
}

// NewUser函数返回User结构体
func NewUser(id int, name string, Region, Street, Number string) User {
    return User{
        ID:   id,
        Name: name,
        Addr: &Address{Region, Street, Number},
    }
}

func main() {
    //调用函数
    u := NewUser(2, "wpfs", "北京市", "海淀", "0001")
    fmt.Printf("%#v\n", u)
    fmt.Println(u.Addr)
    //更改元素
    u.Addr.Region = "天津"
    fmt.Println(u.Addr)
}

结构体可见性

mkdir visibility
go mod init visibility
mkdir visibility/users
wupengfei@wupengfeideAir visibility % tree .
.
├── go.mod
├── main.go
└── users
    └── users.go

2 directories, 3 files

users/users.go

package users

// 定义address结构体
type address struct {
    Region string
    Street string
    Number string
}

// 定义User结构体
type User struct {
    ID   int
    Name string
    address
}

main.go

package main

import (
    "fmt"
    "visibility/users"
)

func main() {
    /*
        type StructName struct {}

        结构体m名字
        StructName
        structName

        属性:
        AttrName
        attrName

        匿名结构体嵌套
        S A => s A => 结构体名小写, 包外不能创建结构体对象
        S a => s a => 结构体名小写, 包外不能创建结构体对象

        S A => S A => 结构体名大写, 包外可以创建结构体对象, 属性名大写, 属性也可以访问
        S a => S a => 结构体名大写, 包外可以创建结构体对象, 属性名小写, 属性不可以访问

        s A => S A => 结构体名大写, 包外可以创建结构体对象, 属性名大写, 属性也可以访问
        s a => S a => 结构体名大写, 包外可以创建结构体对象, 属性名小写, 属性不可以访问

        s A => s A => 结构体名小写, 包外不能创建结构体对象
        s a => s a => 结构体名小写, 包外不能创建结构体对象
    */
    var u users.User
    //var a users.address
    fmt.Printf("%#v\n", u)
    //fmt.Printf("%#v", a)

    fmt.Printf("%#v\n", u.ID)
    fmt.Printf("%#v\n", u.Name)
    fmt.Printf("%#v\n", u.Region)
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容