golang内置数据类型作为函数参数

  • 先上结论

  golang的所有内置类型作为函数参数传递都是传值的方式(没有传递引用一说),需要注意的是:数组、slice和map作为函数参数时也是传值,但是如果对结构内元素进行的修改,修改的是原数据。如果是对其进行整体赋值,则不会修改原数据,相当于拷贝出一个新的临时变量。要想无论什么情况都修改原数据,可以通过传递指针参数实现。

  • 来段实例代码
  1 package main
  2
  3 import (
  4     "bytes"
  5     "fmt"
  6     "strings"
  7 )
  8
  9 func f_1(a int) {
 10     a = 2
 11 }
 12
 13 func f_1_1(a *int) {
 14     *a = 2
 15 }
 16
 17 func f_2(s string) {
 18     s = "cba"
 19 }
 20
 21 func f_2_1(s *string) {
 22     *s = "cba"
 23 }
 24
 25 func f_3(v []string) {
 26     v[0] = "haha"
 27 }
 28
 29 func f_3_1(v []string) {
 30     v = nil
 31 }
 32
 33 func f_3_2(v *[]string) {
 34     *v = nil
 35 }
 36
 37 func f_4(m map[int]int) {
 38     m[1] = 3
 39     m[3] = 1
 40 }
 41
 42 func f_4_1(m map[int]int) {
 43     m = nil
 44 }
 45
 46 func f_4_2(m *map[int]int) {
 47     *m = nil
 48 }
 49
 50 func f_5(b []byte) {
 51     b[0] = 0x40
 52 }
 53
 54 func f_5_1(b []byte) {
 55     b = bytes.Replace(b, []byte("1"), []byte("a"), -1)
 56 }
 57
 58 func f_5_2(b *[]byte) {
 59     *b = bytes.Replace(*b, []byte("1"), []byte("a"), -1)
 60 }
 61
 62 type why struct {
 63     s []string
 64 }
 65
 66 func (ss why) SetV(s []string) {
 67     ss.s = s
 68 }
 69
 70 func (ss *why) SetP(s []string) {
 71     ss.s = s
 72 }
 73
 74 func (ss why) String() string {
 75     return strings.Join(ss.s, ",")
 76 }
 77
 78 func main() {
 79     a := 1
 80     s := "abc"
 81     v := []string{"sd", "aa"}
 82     m := map[int]int{1: 1, 2: 2, 3: 3}
 83     f_1(a)
 84     f_2(s)
 85     f_3(v)
 86     f_4(m)
 87     fmt.Printf("%d,%s,%v,%v\n", a, s, v, m)
 88     f_3_1(v)
 89     f_4_1(m)
 90     fmt.Printf("%d,%s,%v,%v\n", a, s, v, m)
 91     f_1_1(&a)
 92     f_2_1(&s)
 93     f_3_2(&v)
 94     f_4_2(&m)
 95     fmt.Printf("%d,%s,%v,%v\n", a, s, v, m)
 96     b := []byte("12145178")
 97     f_5(b)
 98     fmt.Printf("%s\n", b)
 99     f_5_1(b)
100     fmt.Printf("%s\n", b)
101     f_5_2(&b)
102     fmt.Printf("%s\n", b)
103     ss := &why{}
104     ss.SetV([]string{"abc", "efg"})
105     fmt.Println(ss)
106     ss.SetP([]string{"abc", "efg"})
107     fmt.Println(ss)
108 }

输出如下

 1 1,abc,[haha aa],map[1:3 2:2 3:1] slice和map值传递是可以修改原数据的,但基本数据类型不行
 2 1,abc,[haha aa],map[1:3 2:2 3:1] 整体赋值不会修改原数据,值得注意的是map是无序的
 3 2,cba,[],map[] 传递指针始终会修改原数据
 4 @2145178 同上
 5 @2145178 使用bytes.Replace实际上还是赋值,所以不会修改原数据
 6 @2a45a78 使用指针传参就可以了
 7          类的成员函数定义为传值的方式,不会修改原数据(原数据为空)
 8 abc,efg  类的成员函数定义为传指针的方式,可以修改原成员变量
 9
10 成功: 进程退出代码 0.

现在弄明白了吗~

时间: 2024-10-11 13:20:01

golang内置数据类型作为函数参数的相关文章

Python的内置数据类型

Python在编程语言中的定位: 脚本语言--scriptinglanguage 高阶动态编程语言. Python是以数据为主,变量的值改变是指变量去指到一个地址. Id(变量)-->>展示变量的地址. 一个具体的值,会有不同的变量名.. Python的数据类型: 数字.字符串.列表.元组.字典 数字和字符串其实是很基本的数据类型,在Python中和其他语言相差不是很大的,在这里就不细讲了. Dictionary介绍 Dictionary是Python的内置数据类型之一,它定义了键和值之间的一

【Python】内置数据类型

参考资料: http://sebug.net/paper/books/dive-into-python3/native-datatypes.html http://blog.csdn.net/hazir/article/details/10159709 1.Boolean[布尔型] # coding:utf-8 ''' Created on 2014-4-29 @author: Administrator ''' # Python中的布尔值为True.False,首字母大写 def test_b

python基础-内置数据类型

一.简介 如果你用过C或者C++,你该知道你的许多工作集中在实现数据结构上面.你需要管理内存分配,部署内存结构等等.这些东西比较乏味,通常会让你无法集中在真正想实现的目标上面. 而在Python中,许多这种乏味的工作都去去除了.Python提供了强大的对象类型作为Python语言的一部分,解决问题时,你不需要手工写代码来实现这些结构了.而且你也不需要亲自实现自己的数据类型.因为内置对象类型有很多好处.如果你是一个编程大牛,哪另当别论,对于初学者,我们首先需要知道如何使用. Python内置数据类

Python中内置数据类型list,tuple,dict,set的区别和用法

Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个内置数据类型功不可没,他们即是list, tuple, dict, set.这里对他们进行一个简明的总结. (原链接:http://www.jb51.net/article/76339.htm) List 字面意思就是一个集合,在Python中List中的元素用中括号[]来表示,可以这样定义一个List: ? 1 L = [12, 'China', 19.998] 可以看到并不要求元素的类型都是一样的.当然也可以定

python计算非内置数据类型占用内存

getsizeof的局限 python非内置数据类型的对象无法用sys.getsizeof()获得真实的大小,例: import networkx as nx import sys G = nx.Graph() l = [i for i in xrange(10000)] print "size of l:", sys.getsizeof(l) G.add_nodes_from(l) print "size of graph:", sys.getsizeof(G)

(一)Python入门-2编程基本概念:07内置数据类型-基本算数运算符

一:Python内置数据类型 每个对象都有类型,python中最基本的内置数据类型: 1. 整型:整数,2345,10,50 2. 浮点型:小数,3.14 或者科学计数法 314e-2 3. 布尔型:表示真假,仅包含:True.False 4. 字符串型:由字符组成的序列. “abc”,”speed”,“我爱你” 二:数字和基本运算符 Python 支持整数(如:50,520)和浮点数(如:3.14,10.0, 1.23e2),我们可以对数字做如下 运算. 运算符 说明 示例 结果 + 加法 3

C++内置数据类型和变量

一.数据类型 1.什么是数据类型? 数据类型是为了固定内存空间的别名. 2.数据类型解决什么问题? 解决编程中出现的各种各样的数据. 3.数据类型分类? C++内置数据类型可分为两组:第一组为基本类型,包括整数和浮点数:第二组为复合类型,包括数组.字符串.结构.类和指针. 二.变量 1.什么是变量? 变量就是一段连续内存空间的别名,程序通过变量来申请.命名.访问内存空间. 2.变量解决C++当中什么问题? 信息将存储在哪里 要存储什么值 存储何种类型的信息

python 内置数据类型

一.Dictionary 的介绍 dictionary 是python 的内置类型之一,它定义键和值之间一对一的关系 1.定义dictionary 2.修改dictionary NOTE: Dictionary 是无序的.当使用 dictionary 时,您需要知道:dictionary 的 key 是大小写敏感的. 3.dictionary 中混用数据类型 4.dictionary 删除元素 二.List 介绍 List 是 Python 中使用最频繁的数据类型.它很像java中的ArrayL

C#调用C++ 平台调用P/Invoke 结构体--含有内置数据类型的一维、二维数组、字符串指针【六】

[1]结构体中含有内置数据类型的一维数组 C++代码: typedef struct _testStru3 { int iValArrp[30]; WCHAR szChArr[30]; }testStru3; EXPORTDLL_API void Struct_ChangeArr( testStru3 *pStru ) { if (NULL == pStru) { return; } pStru->iValArrp[0] = 8; lstrcpynW(pStru->szChArr, L&quo