【Go】go语言中的几点细节

Go是门简洁、高效的语言,因为在底层封装了许多东西,在go的编写中有许多细节需要我们留意,此文章尽可能通过代码来列举一些go语言中的细节(keng)。
1.

func main() {

	slice := []int{0, 1, 2, 3}
	m := make(map[int]*int)

	for key, val := range slice {
		m[key] = &val
	}

	for k, v := range m {
		fmt.Println(k, "->", *v)
	}
}
// 0 -> 3
// 1 -> 3
// 2 -> 3
// 3 -> 3

go中传递是值传递,对于for range slice 其实go在底层遍历的是slice的副本。对于变量key和val在遍历中是不会重新创建,也就是例子中只有一个变量key和val,在遍历中因为取了val的指针,遍历结束,val指针指向遍历最终值为3。

2.比较

  • go中的slice、map、函数是不可以比较的,除了和nil比较。
  • 函数和nil比较总返回false
  • sliec在var s []int 或 var s []int = nil声明时和nil比较会相等,其余比较一般不相等,map同理
  • struct 比较时编译器会根据双方的成员类型(如结构体中有slice类型则不可比较)、成员声明顺序来确定是否可以比较,在运行时根据成员具体值的比较返回比较值
  • 数组可以比较,编译器在编译期间会检查两个数组的成员类型(成员类型不能比较则不能比较)和成员数量,在运行时比较各成员的值

3

func main() {
    str := "hello"
    str[0] = 'x'
    fmt.Println(str)
}

golang中的字符串只读的,不能修改
4. defer

func increaseA() int {
    var i int
    defer func() {
        i++
    }()
    return i
}

func increaseB() (r int) {
    defer func() {
        r++
    }()
    return r
}

func main() {
    fmt.Println(increaseA())  // 0
    fmt.Println(increaseB())  // 1
}

defer延迟执行是go中重要的机制,defer执行在return之前,increaseA返回匿名变量,实际上在return i 时就执行s = i 将s作为函数结果传递出去了。increaseB的函数声明的返回参数和return中的一致,因此执行defer函数时会改变r的值,这里的r都是同一个变量。
5.

var p *int

func foo() (*int, error) {
    var i int = 5
    return &i, nil
}

func bar() {
    //use p
    fmt.Println(*p)
}

func main() {
    p, err := foo()
    if err != nil {
        fmt.Println(err)
        return
    }
    bar()
    fmt.Println(*p)
}

此段代码会造成运行时错误,原因在于:=对于不同作用域的相同变量会重新定义,就是main函数中的指针p会覆盖全局变量p,在执行bar函数时,此时全局指针p为nil,bar函数拿不到指针则报错崩溃。
6.

func main() {
    data := []int{1,2,3}
    i := 0
    ++i
    fmt.Println(data[i++])
}

上述代码会报错,原因在于go中不存在++i--i,对于i++它是一条语句,并不是一个表达式,这是go语言在自增方面与其他语言的不同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
辽B代驾管理系统对代驾订单管理、用户咨询管理、代驾订单评价管理、代驾订单投诉管理、字典管理、论坛管理、公告管理、新闻信息管理、司机管理、用户管理、管理员管理等进行集化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行辽B代驾管理系统程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。辽B代驾管理系统的开发让用户查看代驾订单信息变得容易,让管理员高效管理代驾订单信息。 辽B代驾管理系统具有管理员角色,用户角色,这几个操作权限。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看代驾订单,删除代驾订单操作,新增代驾订单操作,修改代驾订单操作。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。新闻管理页面,此页面提供给管理员的功能有:新增新闻,修改新闻,删除新闻。新闻类型管理页面,此页面提供给管理员的功能有:新增新闻类型,修改新闻类型,删除新闻类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值