a, b *string传入swap函数内部后,使用的是a,b的副本a1,b1, 他们的值是相同的,都是字符串的首字母的地址,当在内部交换这两个值时,函数结束后,这两个值就被销毁了;如果交换的是这两个值代表的数据,函数结束后,这两个地址值被销毁,但地址指向的字符串数据已经被修改了,所以可以交换成功.
首先说一下go中的字符串类型:
下面介绍字符串的三种遍历方式,根据实际情况选择即可.
该遍历方式==缺点==:遍历是按照字节遍历,所以呢如果有中文等非英文字符,就会出现乱码,比如要遍历"abc北京"这个字符串,效果如下:
该方式是按照字符遍历的,所以不会出现乱码,如下:
运行结果:
由于下标的不确定性,所以引出了下面的遍历方式.
①. 可以先将字符串转成 []rune 切片
运行效果:
由此可见下标是按1递增的,没有产生跳跃现象.
第一步:all.bash
% cd $GOROOT/src
% ./all.bash
第二步:make.bash
. ./make.bash --no-banner
第三步. cmd/dist
echo "# Building compilers and Go bootstrap tool for host, $GOHOSTOS/$GOHOSTARCH."
buildall="-a"
if [ "$1" = "--no-clean" ]; then
buildall=""
fi
./cmd/dist/dist bootstrap $buildall -v # builds go_bootstrap
使用的编译器套件 cmd/dist 编译产生一个版本的gotool,go_bootstrap.但go_bootstrap并不是完整得gotool,比方说 pkg/net 就是孤立的,避免了依赖于 cgo.要编译的文件的列表以及它们的依赖项,是由cmd/dist编译的 ,所以十分谨慎地避免引入新的生成依赖项 到 cmd/go.
第四步:go_bootstrap
现在, go_bootstrap 编译完成了,make.bash 的最后一部就是使用 go_bootstrap 完成 Go 标准库的编译,包括整套 gotool 的替换版.
echo "# Building packages and commands for $GOOS/$GOARCH."
"$GOTOOLDIR"/go_bootstrap install -gcflags "$GO_GCFLAGS" \
-ldflags "$GO_LDFLAGS" -v std
第五步:run.bash
现在,make.bash 完成了,运行回到了 all.bash,它将引用 run.bash.run.bash 的工作是编译和测试标准库,运行时以及语言测试套件.
按值传递函数参数,是拷贝参数的实际值到函数的形式参数的方法调用.在这种情况下,参数在函数内变化对参数不会有影响.
默认情况下,Go编程语言使用调用通过值的方法来传递参数.在一般情况下,这意味着,在函数内码不能改变用来调用所述函数的参数.考虑函数swap()的定义如下.
代码如下:
/* function definition to swap the values */
func swap(int x, int y) int {
var temp int
temp = x /* save the value of x */
x = y /* put y into x */
y = temp /* put temp into y */
return temp;
}
现在,让我们通过使实际值作为在以下示例调用函数swap():
package main
import "fmt"
func main() {
/* local variable definition */
var a int = 100
fmt.Printf("Before swap, value of a : %d\n", a )
fmt.Printf("Before swap, value of b : %d\n", b )
/* calling a function to swap the values */
swap(a, b)
fmt.Printf("After swap, value of a : %d\n", a )
fmt.Printf("After swap, value of b : %d\n", b )
func swap(x, y int) int {
让我们把上面的代码放在一个C文件,编译并执行它,它会产生以下结果:
Before swap, value of a :100
After swap, value of a :100
这表明,参数值没有被改变,虽然它们已经在函数内部改变.
通过传递函数参数,即是拷贝参数的地址到形式参数的参考方法调用.在函数内部,地址是访问调用中使用的实际参数.这意味着,对参数的更改会影响传递的参数.
要通过引用传递的值,参数的指针被传递给函数就像任何其他的值.所以,相应的,需要声明函数的参数为指针类型如下面的函数swap(),它的交换两个整型变量的值指向它的参数.
func swap(x *int, y *int) {
temp = *x /* save the value at address x */
*x = *y /* put y into x */
*y = temp /* put temp into y */
现在,让我们调用函数swap()通过引用作为在下面的示例中传递数值:
/* calling a function to swap the values.
* a indicates pointer to a ie. address of variable a and
* b indicates pointer to b ie. address of variable b.
*/
*x = *y /* put y into x */
After swap, value of b :100
这表明变化的功能以及不同于通过值调用的外部体现的改变不能反映函数之外.
以上就是土嘎嘎小编为大家整理的go语言字符串引用相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!