`

Go Web 编程 一书第52页中的错误: string 并非类似指针类型

阅读更多

<< Go Web 编程>> 一书 第 52 页说到:

Go 语言中 string,slice,map 这三种类型的实现机制类似指针,所以可以直接传递, 而不用取地址后传递指针。

 这个说法套在 string 上, 是错误的。

package main

import "fmt"

func add1(a string) string {
	a = a + " simida"
	return a
}

func main() {
	x := "I am Jon"
	fmt.Println("x = ", x)
	x1 := add1(x)

	fmt.Println("x + 1 = ", x1)
	fmt.Println("x = ", x)
	/*output:
	x =  I am Jon
	x + 1 =  I am Jon simida
	x =  I am Jon
	*/
}

 以上例子中 x 的值在调用函数add1()之后无变化.

 

package main

import "fmt"

func add1(a *string) string {
	*a = *a + " simida"
	return *a
}

func main() {
	x := "I am Jon"
	fmt.Println("x = ", x)
	x1 := add1(&x)

	fmt.Println("x + 1 = ", x1)
	fmt.Println("x = ", x)
	/*output:
	x =  I am Jon
	x + 1 =  I am Jon simida
	x =  I am Jon simida
	*/
}

 采用指针传递, 则调用函数之后x值发生变化.

由此可见, string 类型的实现机制 并非 类似指针.

 

而 slice 和 map 的实现机制则类似指针, 所以不必取地址传递指针.

package main

import "fmt"

func add1(a []int) []int {
	for k, v := range a {
		a[k] = v + 1
	}
	return a
}

func main() {
	x := make([]int, 2, 6)
	fmt.Println("x = ", x)
	x1 := add1(x)

	fmt.Println("x + 1 = ", x1)
	fmt.Println("x = ", x)
	/*output:
	x =  [0 0]
	x + 1 =  [1 1]
	x =  [1 1]
	*/
}

 

 

package main

import "fmt"

func add1(a map[string]int) map[string]int {
	for k, v := range a {
		a[k] = v + 1
	}
	return a
}

func main() {
	x := map[string]int{"a": 0, "b": 0}
	fmt.Println("x = ", x)
	x1 := add1(x)

	fmt.Println("x + 1 = ", x1)
	fmt.Println("x = ", x)
	/*output:
	x =  map[a:0 b:0]
	x + 1 =  map[a:1 b:1]
	x =  map[a:1 b:1]
	*/
}

 

0
2
分享到:
评论

相关推荐

    std::string format格式化函数源代码及两种格式化方法

    本程序提供了std::string 类型的Format格式化函数,以及两种格式化string字符串的方法,主方法在str.hpp文件中,测试文件在string_format.cpp中,已测试可用

    StringAPI.java

    Java String 类型 API 测试代码 1.String和char[]之间的转换 toCharArray(); 2.String和byte[]之间的转换 getBytes() Arrays工具类 : Arrays.toString(names) String类 String replace(char oldChar, ...

    C++ XMind关于std::string总结

    在任何编程语言中,字符串都是重中之重。通过使用XMind总结C++ XMind中的字符串,了解并熟练掌握string对象的构造和初始化,插入删除替换,查找和比较,把所有相关的操作整合在一个页面上,提高工作效率

    stl::string与CString类似函数

    关于string的几个类似CString的函数

    java编程中String类型时间转化成Date类型

    java编程中String类型时间转化成Date类型

    包含string对象的结构与memset初始化操作

    而对于较为复杂和抽象的类型,包括我们自定义的各种业务类型,这些类型中可能存在多层继承关系,那么这些结构资源中就隐藏着虚函数表、虚指针,对于多层聚合、组合的类型也会存在自定义类型的指针对象,这些资源都...

    详解C++ string常用截取字符串方法

    string常用截取字符串方法有很多,但是配合使用以下两种,基本都能满足要求: find(string strSub, npos); find_last_of(string strSub, npos); 其中strSub是需要寻找的子字符串,npos为查找起始位置。找到返回子...

    C/C++中关于std::string的compare陷阱示例详解

    主要给大家介绍了关于C/C++中关于std::string的compare陷阱的相关资料,文中先对C/C++中的std::string进行了简单的介绍,通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。

    理解C# String类型:特殊的引用类型

    理解C# String类型:特殊的引用类型

    自编MStirng(类似std::string)以及配套的4种iterators

    自己编写的string类,名字叫做MString。并且编写了配套的iterator、const_iterator、reverse_iterator、const_reverse_iterator。完全支持stl的各种算法,包括支持insert_iterator()转换。编写它的目的不是为了使用...

    Super string 库

    int break_string(std::string instr, std::string subStr, vector&lt;std::string&gt;* subs); //以subStr为标记切割instr为多个单词,存储于subs std::string super_CString::getTimeString(bool fgf);//获得表示当前...

    Java程序设计基础:创建String字符串.pptx

    String是Java库中一个预定义的类,在java.lang包中。 String类型 字符串常量:双引号括起来的多个字符组成的序列,每一个字符占2个字节,在内存中共占用2n个字节,n为字符的个数。 例如: " 1234 " , " hello world ...

    get a string from a fun

    get string from a fun

    js中的string.format函数代码.docx

    js中的string.format函数代码.docx

    使用字符指针实现的一个简单string类

    使用字符指针写的string类,对+ 、 =操作符进行了重载,实现了strcpy,strcmp,strcat等功能。

    Delphi网络公用函数

    //获取网络中的所有网络类型 Function NetGetNetList(var List: Tstringlist): Boolean; //获取网络中的工作组 Function NetGetGroupList(var List: TStringList): Boolean; //获取工作组中所有计算机 ...

    利用C++实现从std::string类型到bool型的转换

    利用输入字符串流:std::istringstream 代码如下:bool b;std::string s = “true”;std::istringstream(s) &gt;&gt; std::boolalpha &gt;&gt;... 您可能感兴趣的文章:详解C++中String类模拟实现以及深拷贝浅拷贝自己模拟写C++中的St

    函数库

    Strs:array of String):String; //删除Text中的空格 function FmtText(Text:String):String; //格式化浮点数,修正其中的浮点误差 function FmtFloat(Value:Extended;Digits:Integer=4):Double; /...

    C++语言string类的实现 完整源代码 pdf

    C++语言string类的实现 完整源代码 pdf

    Delphi常用公用函数

    string): string; //小写人民币转换成大写人民币 function IsExistForm(aFormObject: string): Boolean; //查询窗体是否存在 function CalcAmountOfField(aQry: TQuery; aFieldName: string; var oAmountStr: ...

Global site tag (gtag.js) - Google Analytics