まず、オブジェクト型とオブジェクトポインタコールのタイプ
ゴー言語は持っている値の型とポインタ型を直接その呼び出し値受信者法とポインタ受信者法区別を:
例を見てください:
package main
import "fmt"
type IFather interface {
getName() string
setName(string)
}
type Person struct {
name string
}
func(p Person) getName() string {
return p.name
}
func(p *Person) setName(name string) {
p.name = name
}
func main() {
per := Person{}
fmt.Printf("未初始化默认值:per :%s\n",per.getName())
per.setName("test")
fmt.Printf("设置值后:per :%s\n",per.getName())
per2 := &Person{name:"lisi"}
fmt.Printf("初始化值后:per2 :%s\n",per2.getName())
per2.setName("wanger")
fmt.Printf("设置值后:per2 :%s\n",per2.getName())
}
出力:
未初始化默认值:per1 :
设置值后:per1 :test
初始化值后:per2 :lisi
设置值后:per2 :wanger
そしてその値方法及び受信ポインタ受信者メソッドを呼び出すことができるポインタ型変数の値型変数。
この方法は、受信者の値を宣言し実行するには、この値のコピーを呼び出すときに使用されますが、しばらくポインタあなたが受信者のシェアを呼び出すときに、受信者がこの方法で値がポイントを変更することができ、値を指摘呼び出します。
第二に、コールへのインタフェースおよびインタフェースポインタ
受信者と受信インタフェースの違いに割り当てられたポインタ値:
あるいは、上記の例では、それはほとんど変化:オブジェクトを置くには、インターフェイスに割り当てられています
package main
import "fmt"
type IFather interface {
getName() string
setName(string)
}
type Person struct {
name string
}
func(p Person) getName() string {
return p.name
}
func(p *Person) setName(name string) {
p.name = name
}
func main() {
var IPer IFather = &Person{}
var IPer2 IFather = Person{name:"lisi"}
fmt.Printf("未初始化默认值:s1:%s\n",IPer.getName())
IPer.setName("test")
fmt.Printf("设置值后:s1:%s\n",IPer.getName())
}
コンパイルエラー:この行が表示されますで
var IPer2 IFather = Person{name:"lisi"}
人はそれを割り当てることができない、のsetName機能IFatherインタフェースを実装していません。
表面に*人の人がそう*人も自動的のgetName機能を持っているので、インタフェースIFatherの実装、のgetName関数の値を実現するために指さのgetName機能を実現するが、*しませんでした。ゴー受信者の値として人は、受信者の値がコピーされているので、それは人に影響を与えることができないものを元の値、知りません。ポインタは、その逆の暗黙的な変換値を与えるために行くではなくなります。
したがって、変数Tの型がTの方法は唯一の受信者であり、可変型* T * T Tを有しており、受信者がこの方法で、受信者は、メソッドの値型を達成さ換言すれば、自動的に生成することが可能です両方の受信機に影響を与えないので、受信者は、ポインタの種類に応じた方法です。受信者がこの時点である場合は、受信者がポインタ型法達成されたときに、自動的にメソッドの値型を生成し、値型が生成するため、今達成することができない(ポインタを介して)元の受信者に必要な変更、コピーは、実際の発信者に影響を与えません。
(1)タイプのポインタ変数* Tは、受信およびT * T法できます
(2)のみT Tメソッドを入力受信しました