Go 言語のカプセル化とは、抽象化されたフィールドとそのフィールドに対する操作を一緒にカプセル化することであり、データは内部で保護され、プログラムの他のパッケージは承認されたメソッドを通じてのみフィールド上で操作できます。
カプセル化の利点:
- 実装の詳細を非表示にします。
- データを検証して、データが安全かつ合理的であることを確認できます。
カプセル化を反映する方法:
- プロパティを構造体にカプセル化します。
- カプセル化はメソッドやパッケージを通じて実現されます。
カプセル化の実装手順:
- 構造体とフィールドの最初の文字を小文字にします。
- コンストラクターと同様に、構造体が配置されているパッケージの最初の文字を大文字にしてファクトリ モード関数を提供します。
- 属性を判断して値を割り当てるための、大文字の Set メソッド (他の言語の public と同様) を提供します。
- プロパティの値を取得するには、大文字の Get メソッド (他の言語の public と同様) を提供します。
【例】従業員の場合、年齢や給与などのプライバシーを気軽に確認することはできず、入力された年齢については合理的な確認が行われます。コード構造は次のとおりです。
person.go のコードは次のようになります。
package model
import "fmt"
type person struct {
Name string
age int //他のパッケージから直接アクセスできない..
sal float64
}
//工場模様の関数を書く、コンストラクタに相当
func NewPerson(name string) *person {
return &person{
Name : name,
}
}
//年齢と給与にアクセスするために、2つのSetXxxメソッドと2つのGetXxxメソッドを作成する
func (p *person) SetAge(age int) {
if age >0 && age <150 {
p.age = age
} else {
fmt.Println("年齢の範囲が正しくありません..")
//デフォルト値をプログラマに与えます
}
}
func (p *person) GetAge() int {
return p.age
}
func (p *person) SetSal(sal float64) {
if sal >= 3000 && sal <= 30000 {
p.sal = sal
} else {
fmt.Println("給与範囲が正しくありません..")
}
}
func (p *person) GetSal() float64 {
return p.sal
}
main.go のコードは次のようになります。
package main
import (
"fmt"
"../model"
)
func main() {
p := model.NewPerson("smith")
p.SetAge(18)
p.SetSal(5000)
fmt.Println(p)
fmt.Println(p.Name, " age =", p.GetAge(), " sal = ", p.GetSal())
}
「 Go 言語パッケージの概要と実装の詳細」についてわかりやすく解説!絶対に観るべきベスト2動画
【元Javaエンジニア】Go言語の将来性・できること・メリットは?
【初心者必見!】Go言語とは?できることや学ぶメリット・将来性について解説