go for range坑和闭包坑的分析

看程序:

package main
import (
  "fmt"
  "time"
)
func main() {
  str := []string{"I","like","Golang"}
  for _, v := range str{
   v += "good"
  }
  for k, v := range str{
   fmt.Println(k, v)
  }
  time.Sleep(1e9)
}

结果:

0 I
1 like
2 Golang

想一想,为什么。

再看:

package main
import (
  "fmt"
  "time"
)
func main() {
  str := []string{"I","like","Golang"}
  for k, v := range str{
   fmt.Println(&k, &v)
  }
  time.Sleep(1e9)
}

结果:

0xc000012050 0xc00000e1e0
0xc000012050 0xc00000e1e0
0xc000012050 0xc00000e1e0

想一想,为什么。

再看:

package main
import (
  "fmt"
  "time"
)
func main() {
  str := []string{"I","like","Golang"}
  for k, v := range str{
   str = append(str, "good")
   fmt.Println(k, v)
  }
  time.Sleep(1e9)
}

结果:

0 I
1 like
2 Golang

想一想, 为什么。

再看:

package main
import (
  "fmt"
  "time"
)
func main() {
  str := []string{"I","like","Golang"}
  for k, v := range str{
   go func(i int, s string){
    fmt.Println(i, s, k, v)
   }(k, v)
  }
  time.Sleep(1e9)
}

结果:

0 I 2 Golang
1 like 2 Golang
2 Golang 2 Golang

想一想,为什么。

最后再看:

package main
import (
  "fmt"
  "time"
)
func main() {
  str := []string{"I","like","Golang"}
  for k, v := range str{
   go func(i int, s string){
    fmt.Println(i, s, k, v)
   }(k, v)
   time.Sleep(1e9)
  }
  time.Sleep(5e9)
}

结果:

0 I 0 I
1 like 1 like
2 Golang 2 Golang

想一想,为什么。

不多说。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • 为什么Go语言把类型声明放在后面?

    关于类型,官网上有一段仔细地介绍了一下函数指针的部分,现在的设计比起 C 的语法,清晰很多. 也就是说,类型放在后面是为了更加清晰易懂.Rob Pike 曾经在 Go 官方博客解释过这个问题(查看原文:Go's Declaration Syntax),简略翻译如下(水平有限翻译的不对的地方见谅): 引言 Go语言新人常常会很疑惑为什么这门语言的声明语法(declaration syntax)会和传统的C家族语言不同.在这篇博文里,我们会进行一个比较,并做出解答. C 的语法 首先,先看看 C 的

  • go代码实现买房贷款月供计算的方法

    贷款金额:100元(先以100元为例,来对比下公积金贷款和商业贷款) 公积金贷款年利率: 3.25% 商业贷款的年利率: 4.90% 贷款期限:360个月(30年) 还款方式:等额本息 计算公式:之前推导过, 用等比数列搞起即可 go代码如下: package main import ( "fmt" "math" ) func get_pmt(f_interest_rate float64, term_number int, principal int) float

  • go for range遍历二维数组的示例

    go for range 遍历二维数组 var arry [2][3] int for index,_ := range arry { fmt.Print(index) } 运行结果: 0 1   没有遍历所有的6个元素. 二维数组 arry 可以理解为:拥有两个 一维数组元素 的一维数组,所以以上只是遍历了其的两个元素,index分别是0 1,value是两个 拥有三个int类型元素 的一维数组. var arry [2][3] int for index,value := range arr

  • linux下搭建go环境的安装配置讲解

    linux下搭建go环境很简单: 1.下载go1.2.1.linux-386.tar.gz,网上到处有类似包,并放到linux目录下. taogeqq@taogeqq-virtual-machine:~/myspace$ ls a.out go1.2.1.linux-386.tar.gz test.cpp test.go taogeqq@taogeqq-virtual-machine:~/myspace$ 2.  切换到root用户,在root下解压,解压即安装,多么绿色的软件啊: root@t

  • 用go gin server来做文件上传服务

    之前已经go get安装了gin, 现在来玩下用go gin server作图片上传服务, 代码目录如下: taoge:~/test_gin$ tree . |-- public |-- template | `-- select_file.html `-- test_gin_server.go 2 directories, 2 files taoge:~/test_gin$ test_gin_server.go内容: package main import ( "fmt" "

  • strings命令分析浅谈Go和C++编译时的一点小区别

    最近查一个bug, 用strings命令分析, 竟然出乎意料地没有结果, 非常纳闷. 最后根据这个线索查出了bug的根本原因. 1.  在C++中, 即使函数在代码层面没有被调用, 也会最终编译到二进制中, 用strings可以分析.  #include <iostream> using namespace std; void fun() { printf("hello world\n"); // strings分析有结果 } int main() { return 0;

  • golang的空标识符理解

    空白符(blank identifier) 空白符的产生可能是因为go不允许变量声明了但不使用.既然不想使用,何必声明变量呢,那就将变量用空白符代替,反正空白符就是用来抛弃的. 我们有时候看到这样的golang代码: import _ "net/http/pprof" 或 for _, c := range "11234" { log.Println(c) } 或 var _ io.Reader = (* XXX)(nil) //全局变量 或 var _ = Sui

  • go panic时如何让函数返回数据?

    现在有这样一个问题:某函数如果正常执行,返回0,如果panic,则返回1,怎么搞呢? package main import "fmt" func test() int { defer func() { if err := recover(); err != nil { return 1 } }() var p *int *p = 0 return 0 } func main() { fmt.Println("ret is", test()) for {} } 这样

  • 使用go gin来操作cookie的讲解

    准确地说, 这个标题是有问题的, go gin只能给浏览器返回操作cookie的指令, 真正执行cookie操作的是浏览器. 但广泛地来讲, 说go gin操作cookie, 也是可以的(间接操作) 来看go gin代码: package main import ( "github.com/gin-gonic/gin" ) func main() { router := gin.Default(); router.GET("/read_cookie", func(c

  • 在go中使用omitempty的代码实例

    omitempty在go中的使用 直接上代码: package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name"` Age int `json:"age"` Addr string `json:"addr,omitempty"` } func main() { p1 := Person{ N

随机推荐