ゴーコア開発の研究ノート(Nianer) - 関数とメソッドの違い

関数およびメソッドとの間の差

  1. 関数パラメータの受け渡しは、値型は、参照型ではないポインタ渡された値型パラメータ、混合することができない、参照型であり、値型です。
  2. (Xのx_type)を()メソッドを渡す値と基準タイプFUNCに応じたパラメータ{...} - > x_typeまたは* x_type
  3. Xパラメータはコンパイラを渡すことができ、ここでいずれかのポインタ型または値型に渡され、同様に処理、すなわち== X&X、図示されている<構造変数> <フィールド構成> == <構成&変数体> <フィールド構造>、my.Name ==(&マイ).nameの
  4. 着信前部構造変数は、方法は、型マイリスト割当フィールド値の変更の機能が影響を与えない、この機能と一致して、後の初期化プロセスの特定のフィールド値にx_typeの種類に依存し変更することができない、説明のmain()値フィールドを初期化するために、 *マイリストタイプフィールドの値が主な影響(の機能が割り当てられている)フィールドの値を変更する初期化します。

多くの場合、掘りインタビューは、以下のプログラム命令例えば、ここにあります

package main

import "fmt"

type Mylist struct {
	Name string
	Age string
}

func (my Mylist) value_type() {
	fmt.Println("都能传,但是到这儿都是值类型")
}

func (my *Mylist) ptr_type() {
	my.Name = "zzz"
	fmt.Println("都能传,但是到这儿都是引用类型")
}

func ptr1_type(my *Mylist) {
	fmt.Println("只能传指针类型")
}

func value1_type(my Mylist) {
	fmt.Println("只能传值类型")
}

func main() {
	var my Mylist          //定义一个结构体实例
	my.Name = "lululu"     //初始化结构体实例my中的字段Name为"lululu"
	
	my.value_type()         //对于方法中,由于编译器优化,传递的结构体变量既可以是值也可以是地址
	fmt.Println(my.Name)    //无论是my为值还是地址,最终传递给绑定变量的都是值拷贝
	(&my).value_type()      
	fmt.Println((&my).Name)

	my.ptr_type()           //但是具体的my.Name的值还是要看结构体绑定变量到底是值类型还是指针类型
	fmt.Println(my.Name)    //结构体变量为值类型,则方法内值的改变不影响main()中初始化变量的值
	(&my).ptr_type()        //结构体变量若为引用类型,则方法内值的改变影响main()中初始化变量的值
	fmt.Println((&my).Name)

	value1_type(my)         //函数中不存在传入绑定变量,所以和之前一样,值类型只能传值类型,地址类型只能传地址类型,不可my和&my代表一个意思
	ptr1_type(&my)          //值类型函数内的改变不影响main()初始化变量的值,引用类型函数内的改变影响main()初始化变量的值,
}
公開された49元の記事 ウォン称賛18 ビュー4005

おすすめ

転載: blog.csdn.net/weixin_41047549/article/details/90142613