写点什么

Go 语言学习查缺补漏 ing Day4

  • 2021 年 12 月 07 日
  • 本文字数:1202 字

    阅读完需:约 4 分钟

作者:ReganYue

来源:恒生LIGHT云社区

Go 语言学习查缺补漏 ing Day4

一、掌握 iota 的使用

请看下面这段代码:


package main
import "fmt"
const ( a = iota _ b c = "ReganYue" d d1 e = iota f = iota)
func main() { fmt.Println(a, b, c, d, d1, e, f)}
复制代码


思考一下输出结果会是什么?


先不公布输出结果。先来谈一谈 iota,iota 是用于给需要自增长常量赋值的标识符。我们可以用下划线 _来省略掉不想要的值。而我们中间给变量赋值了,然后如果后续的变量如果不赋值,后续的 d,d1 的值就会和 c 一样。但是如果再次给一个变量标志为 iota,就又会赋值自增长的值,而且值从这里第一个变量定义时就一直在自增长。


所以输出结果是:



我们再来看一看 iota 这个用法:


package main
import "fmt"
const ( A, B = iota, iota + 1 C, D E, F)
func main() { fmt.Println(A, B, C, D, E, F)}
复制代码


运行结果是:



iota 是在下一行才进行增长,而不是每个变量都增长。

二、哪些类型的变量可以赋 nil

var (    A string = nil    B int    = nil    C interface{} = nil    D chan int = nil    E float64 = nil    F func() = nil    G []int = nil    H map[int]int = nil    I *int = nil)
复制代码


你知道上面哪些类型的变量可以赋 nil 值吗?


显然,A 不是,字符串的空值是"",而不是 nil。B 和 E 也不是,他们是数值型,值只能是数字。


而其它类型的变量,比如 interface、chan、func、slice、map、指针都可以赋 nil 作为空值。

三、Golang 的 init 函数

我们都知道 main 函数是 Golang 程序的入口函数,但是 Golang 还有一个特殊的函数 init 函数你可能不知道,它是先于 main 函数执行的,可以实现例如初始化包里的变量等操作。


第一点应该知道的是:一个包可以有多个 init 函数,甚至一个 go 文件都可以出现许多 init 函数。


第二点:同一个 go 文件中的 init 函数是由上往下调用的,而同一个包中,init 函数的调用顺序是根据文件名的顺序来调用的,至于不同包中的 init 函数调用顺序,如果这些包之间不相互依赖的话,就是按照 main 包中 import 的顺序调用,如果相互依赖那就是看谁先被依赖谁就最后被初始化。


第三点:init 函数不能被赋值给函数变量,也不能调用,不然就会编译失败。


第四点:如果一个包被引用多次,那么这个包只会执行 init()函数一次。

四、将函数返回值赋值的一个注意事项

先来看一段代码:


package main
import "fmt"
func nh() []string { return nil}func main() { h := nh n := nh() if h == nil { fmt.Println("h is nil") } else { fmt.Println("h is not nil") }
if n == nil { fmt.Println("n is nil") } else { fmt.Println("n is not nil") }}
复制代码


再来看看运行结果:



显然,h := nh是将函数 nh 赋值给变量 h,而 n := nh()这样看起来将函数赋值给 n 的操作是将函数 nh 的返回值给了 n。所以 h 不是 nil,而 n 是 nil。

发布于: 25 分钟前阅读数: 2
用户头像

还未添加个人签名 2018.11.07 加入

还未添加个人简介

评论

发布
暂无评论
Go语言学习查缺补漏ing Day4