func run1(a, b int) { fmt.Println("run1 -> 交换前地址", "a", &a, "b", &b) a...
不过函数参数的传递也有两个例外,当函数的形参为接口类型,或者形参是变长参数时,简单的值传递就不能满足要求了,这时Go编译器会介入:对于类型为接口类型的形参,Go编译器会把传递的实参赋值给对应的接口类型形参;对于为变长参数的形参,Go编译器会将零个或多个实参按一定形式转换为对应的变长形参。 1. 函数传参为...
githubpr地址:https://github.com/golang/go/commits/dev.boringcrypto.go1.12/src/runtime/slice.go 扩展其实和slice类似的还有map,chan。先说map,map的官网定义:“Goprovidesabuilt-inmaptypethatimplementsahashtable.Maptypesarereferencetypes,likepointersorslices.”而chan和map一样也是一个指针...
这是创建 map 类型的底层 runtime 方法,注意其返回的是 *hmap 类型,是一个指针。也就是 Go 语言通过对 map 类型的相关方法进行封装,达到了用户需要关注指针传递的作用。就是说当我们在调用 hello 方法时,其相当于是在传入一个指针参数 hello(*hmap),与前面的值类型的案例二类似。这类情况我们称其为 “...
go run -race main.go 我们发现他会提示内存泄露的风险,提示如下: WARNING: DATA RACE Write at 0x00c00011a1b0 by goroutine 15: runtime.mapassign() 这个时候,我们第一反映是,是不是golang 的sync.Map不能嵌套使用?其实我们可以使用下面的代码,来排查下 是不是sync.Map能不能支持嵌套使用。
形参和实际参数内存地址不一样,证明是值传递 package main import"fmt"func main() { m := make(map[string]int) m["age"] =8fmt.Printf("原始map的内存地址是:%p\n", &m) modifyMap(m) fmt.Printf("改动后的值是: %v\n", m) }
其实,在创建 map 的时候,最终调用的是 runtime.makemap 函数,makemap 函数返回的是一个 *hmap 类型,也就是说返回的是一个指针,所以我们创建的 map 其实就是一个 *hmap。 因为map 本质上就是个指针,所以通过 map 类型的参数可以修改原始数据。
我们可以只传递一些命令行参数来生成 CPU/内存/阻塞的profile文件。 查看 go test 命令的以下变体。 image.png 手动使用runtime/pprof包 Go 标准库包含一个包(runtime/pprof),可用于生成各种配置文件。采集到profile后,可以使用go tool pprof对其进行解析分析。这是一个示例代码片段来解释实现。 image.png 使用...
传值的意思是:函数传递的总是原来这个东西的一个副本,一副拷贝。比如我们传递一个int类型的参数,传递的其实是这个参数的一个副本;传递一个指针类型的参数,其实传递的是这个该指针的一份拷贝,而不是这个指针指向的值。 对于int这类基础类型我们可以很好的理解,它们就是一个拷贝,但是指针呢?我们觉得可以通过它修改原...
传递一个参数 package main import "fmt" func sum(numbers ...int) int { total := 0 for _, num := range numbers { total += num } return total } func main() { fmt.Printf("1 = %d\n", sum(1)) } // $ go run main.go ...