package main
import (
"fmt"
)
type Person struct {
Name string
Age int
}
func NewPerson(name string, age int) Person {
return Person{
Name: name,
Age: age,
}
}
func main() {
p := NewPerson("john", 16)
fmt.Printf("%+v", p)
}
創造 Persoon 結構有 Speak method
這裡要注意的 method 設定是否為 value received 還是 pointer received
package main
import (
"fmt"
)
type Person struct {
Name string
Age int
}
func NewPerson(name string, age int) Person {
return Person{
Name: name,
Age: age,
}
}
func (p Person) Speak() {
fmt.Printf("您好,我是%s 我目前年齡%d\n", p.Name, p.Age)
}
// value type,如果異動 struct 裡面的 feild 記得回傳並接收
func (p Person) IncreateAge() Person {
fmt.Printf("increate name p 為 %T value recived \n", p)
p.Age++
return p
}
// Person ChangeName 為 pointer 方法
func (p *Person) ChangeName(name string) {
fmt.Printf("change name p 為 %T pointer recived \n", p)
p.Name = name
}
func main() {
p := NewPerson("john", 16)
p.Speak()
//如果沒有用變數接受回傳值 p 還是原值
p.IncreateAge()
p.Speak()
//用 p 去接收 回傳參數
p = p.IncreateAge()
p.Speak()
//pointer method 則不用再用變數接收
p.ChangeName("George")
p.Speak()
}
使用 type 自行定義類型,並設定定義類型 method
可用於當其他 package 無實現此方法,自行實作
package main
import (
"fmt"
)
//使用 type 自定義類型
type coustomInt int
func (c coustomInt) String() string {
return fmt.Sprintf("這是一個自行定義的類型 %d", c)
}
func main() {
//int 類型轉換 coustomInt 類型
c := coustomInt(100)
fmt.Println(c.String())
}
feild 較少,較為簡單的場景才會使用到
package main
import (
"fmt"
)
type Person struct {
string
int
}
func main() {
p := Person{"jonh", 20}
fmt.Printf("%+v\n", p)
fmt.Println(p.string)
fmt.Println(p.int)
}
範例當中 Company 演示了如何實作類似 OOP 當中的繼承 使用 Anonymous field 及 Embedding Struct
方法來呼叫 String() 方法
package main
import (
"fmt"
)
type Address struct {
city string
}
func (a Address) String() string {
fmt.Println("Address string mehod is called")
return a.city
}
type Person struct {
name string
age int
addr Address
}
type Company struct {
name string
Address //Anonymous field
}
func main() {
p := Person{
name: "jonh",
age: 20,
addr: Address{
city: "台北市",
},
}
fmt.Printf("%+v \n", p)
fmt.Println(p.addr.city)
fmt.Println(p.addr.String())
c := Company{
name: "104",
Address: Address{
city: "台中市",
},
}
//類似於繼承方式可以使用 Address struct method
fmt.Println(c.String())
}