十一、結構體可見性以及構造函數

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)
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章