golang中method的传值与传地址

golang中,struct的method的形式如下:

func (r ReceiverType) funcName(parameters) (results)

如果想要修改struct的成员的值,method被定义时候其ReceiverType必须是struct*形式。如果ReceiverType是struct,则无法改变struct成员的值。

废话少说,代码验证:

package main

import (
    "fmt"
)

type tag struct {
    value int32
}

func (_tag tag) Change() {
    _tag.value = int32(987)
}

type tag2 struct {
    value int32
}

func (_tag *tag2) Change2() {
    _tag.value = int32(987)
}

func main() {
    _tag := new(tag)
    _tag.value = 123
    _tag.Change()
    fmt.Println(_tag)
    _tag.Change()
    fmt.Println(_tag)

    _tag2 := tag2{41}
    _tag2.Change2()
    fmt.Println(_tag2)
    _tag2.Change2()
    fmt.Println(_tag2)
}

上面main函数中,第一段代码中对象_tag的形式为*tag,但是其方法Change无法改变其value值。第二段代码中对象_tag的形式为*ag,但是其方法Change却可以改变其value值。

如果有人感兴趣,我就接着给说道说道。

golang中的method的第一个参数就是它的ReceiverType,而c++以及其同类语言java等C系语言中method的方法默认是class* this。也就是说,golang中method有传对象值与传对象地址的值两种,而C系语言强制要求传递对象的地址。

这么说,就可以理解了吧?

时间: 2024-11-05 18:51:24

golang中method的传值与传地址的相关文章

C/C++中传值和传地址(引用)

C/C++中参数传递有两种方式,传值或传地址(传引用),通常我们要在被调用函数中改变一个变量的值就需要传地址调用方式,例如: void swap_by_value(int a, int b) { int temp; temp = a; a = b; b = temp; } void swap_by_ptr(int* pa, int* pb) { int temp; temp = *pa; *pa = *pb; *pb = temp; } int main(int argc, char* argv

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用 传值 把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 传地址 传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象 传引用 真正的以地址的方式传递参数 传递以后,行参和实参都是同一个对象,只是他们名字不同而已 对行参的修改将影响实参的值 所谓变量是内存地址的一个抽象名字,在静态编译的程序中,所有变量名都会在编译时转换成内存地址,机器不知道变量名,只知道地址. C 语

C语言-传值,传地址(指针),传引用区别和联系

很多编程老手对传值,传地址,传引用的区别搞的也不会很清楚,今天我就花一点时间再次介绍一下这些概念的本质. 其实,不用分为三类,只有两类即可.传值和传引用.为什么会出现传地址(即传指针)呢?本质就是大家一致对传值和传地址概念的理解错误导致,也是对指针的概念的理解错误导致. 指针:(简单补充一下)其实很简单,指针就是一个变量,如果非要说是一个特殊的变量也不为过,因为指针的初始化和解引用等不同的操作方式而已.就内存的分布来说,指针和一个变量在内存中存放是没有任何区别的,无非指针存放的是变量的地址,就是

JAVA的String的传值和传地址问题

关于Java的String类型,可能你会碰到这种情况,将String类型的变量传到一个函数,在这个函数中修改变量的值,但是,实参的值并没有发生改变. Java中String的传值/传地址问题: 例子引入: 1 package com.cnblog.GDUTtiantian.String; 2 3 /** 4 * @author GDUTtiantian 5 */ 6 public class JavaString { 7 8 public static void change(String na

传值和传地址调用

1.原理 传值调用:对形参进行函数变化 传地址调用:对实参进行函数变化 2.实例 #include<iostream>using namespace std;void exchange(int x, int y){             //传入形参    int temp = x;                       //在main函数中x=3,y=4    x = y;    y = temp;    printf("x=%d,y=%d\n", x, y);}

C语言:传值,传地址

形参:形式参数实参:实际参数 传值: 把实参的值复制给形参, 修改函数内的形参,不会影响实参. 传地址: 指针传值,形参为指向实参地址的指针 当对形参的指向操作时,相当于对实参本身进行的操作 #include <iostream> // 交换位置 // “值调用” void swap_value(int x, int y) { int temp = x; x = y; y = temp; } // “引用调用1”,形参:传的是地址,取得是值(*) void swap_p(int *x, int

delphi中move函数的正确理解(const和var一样,都是传地址,所以Move是传地址,而恰恰不是传值)太精彩了 good

我们能看到以下代码var pSource,pDest:PChar;     len: integer;.......................//一些代码Move(pSource,pDest,len); //错误Move(pSource^,pDest^,len); //正确看起来确实好像是传值,而不是传地址,但是各位别忘了,这不是C,C++,而是DelphiObject Pascal,所以,绝不能从函数调用的方法判断是传值还是串地址!!必须看函数的定义,只有定义才能说明是传值还是传地址,再

(转)java 中的 传值 与 传址

在一些面试企业的过程当中 ,很多人看重于基础的考核.其中,传值与传地址 就是一种基础能力考核的关键,这里我总结了 5种很典型的例子 ,最后做了一个总结 首先是8种基本数据类型 下面用 int 类型 做例子 属于传值 public static void method1(int i) { i= i+10; System.out.println("在方法内的值"+i); } public static void main(String[] args) { int i =5; method1

[javaSE] 变量的传值与传址

变量:就是将不确定的数据进行存储.也就是需要在内存中开辟一个空间 这个空间需要一个名称,这个名称就是变量名 基本数据类型:byte,short,int,long,double,float,char,boolean 引用数据类型:类(Class),接口(interface),集合 传值就是把这个变量复制一份 传址就是还是同一个对象 基本数据类型一般都是传值,引用数据类型一般是传地址 import java.util.ArrayList; import java.util.List; public