Go 边看边练 -《Go 学习笔记》系列(一)

本贴最后更新于 1732 天前,其中的信息可能已经事过景迁

相信大家在看编程语言学习教程的时候都会难免觉得有点枯燥:

如果能 边看边练 就会舒服很多,书上的示例代码经过自己实际验证/微调后也更容易理解并消化。

基于这个出发点,黑客派决定给大家上干货中的干货:

即使你以前看过该书,我们也强烈建议你在这里再看一遍,因为这将会带来完全不一样的体验~

光说不练假把式,上货!


ToC


1.1 变量

Go 是静态类型语言,不能在运行期改变变量类型。

使用关键字 var 定义变量,自动初始化为零值。如果提供初始化值,可省略变量类型,由编译器自动推断。

var x int
var f float32 = 1.6
var s = "abc"	

在函数内部,可用更简略的 ":=" 方式定义变量。

func main() {
	x := 123 // 注意检查,是定义新局部变量,还是修改全局变量。该方式容易造成错误。
}

可一次定义多个变量。

多变量赋值时,先计算所有相关值,然后再从左到右依次赋值。

data, i := [3]int{0, 1, 2}, 0
i, data[i] = 2, 100 // (i = 0) -> (i = 2), (data[0] = 100) 

特殊只写变量 "_",用于忽略值占位。

编译器会将未使用的局部变量当做错误。

var s string // 全局变量没问题。

func main() {
	i := 0 // Error: i declared and not used。(可使用 "_ = i" 规避)
}

注意重新赋值与定义新同名变量的区别。

1.2 常量

常量值必须是编译器可确定的数字、字符串、布尔值。

const x, y int = 1, 2     // 多常量初始化
const s = "Hello, World!" // 类型推断

const ( // 常量组
	a, b      = 10, 100
	c    bool = false
)

func main() {
	const x = "xxx" // 未使⽤用局部常量不会引发编译错误。
}

不支持 1UL、2LL 这样的类型后缀。

在常量组中,如不提供类型和初始化值,那么视作与上一常量相同。

const (
	s = "abc"
	x // x = "abc"
)

常量值还可以是 lencapunsafe.Sizeof 等编译器可确定结果的函数返回值。

const (
	a = "abc"
	b = len(a)
	c = unsafe.Sizeof(b)
)

如果常量类型足以存储初始化值,那么不会引发溢出错误。

const (
	a byte = 100  // int to byte
	b int  = 1e20 // float64 to int, overflows
)

枚举

关键字 iota 定义常量组中从 0 开始按行计数的自增枚举值。

const (
	Sunday    = iota // 0
	Monday           // 1,通常省略后续⾏行表达式。
	Tuesday          // 2
	Wednesday        // 3
	Thursday         // 4
	Friday           // 5
	Saturday         // 6
)

const (
	_        = iota             // iota = 0
	KB int64 = 1 << (10 * iota) // iota = 1
	MB                          // 与 KB 表达式相同,但 iota = 2
	GB
	TB
)

在同一常量组中,可以提供多个 iota,它们各自增长。

const (
	A, B = iota, iota << 10 // 0, 0 << 10
	C, D                    // 1, 1 << 10
)

如果 iota 自增被打断,须显式恢复。

const (
	A = iota // 0
	B        // 1
	C = "c"  // c
	D        // c,与上⼀一⾏行相同。
	E = iota // 4,显式恢复。注意计数包含了 C、D 两⾏行。
	F        // 5
)

可通过自定义类型来实现枚举类型限制。

下一篇: https://hacpai.com/article/1437558810339



社区小贴士

  • 关注标签 [golang] 可以方便查看 Go 相关帖子
  • 关注作者后如有新帖将会收到通知
打赏 50 积分后可见
50 积分 • 14 打赏
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    423 引用 • 1338 回帖 • 670 关注
  • 教程
    122 引用 • 419 回帖 • 5 关注
  • 雨痕
    14 引用 • 67 回帖 • 3 关注
1 操作
88250 在 2019-05-23 16:00:42 置顶了该帖

赞助商 我要投放

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • noah

    nice

  • Vanessa
    捐赠者 支持者 赞助者

    这是要叫我学习 Go 的节奏么

    1 回复
  • An
    支持者

    这是要叫我学习 Go 的节奏么

  • youngski

    =。= 我正走在初学 Java 的道路上

  • sparon

    👍 一直比较看好 go

  • jama

    这是要叫我学习 Go 的节奏么

  • someone

    我也要在我的博客中使用 Wide,支持!!!!

  • someone756

    在定义变量并不给他赋值的时候既要用 var 又要用 变量类型,感觉这样有点多此一举。直接用变量类型定义不行吗?这样设计有什么好处吗?

  • 88250
    作者

    @jingxuetao 声明和初始化是不一样的

  • walbee

    学习开始了。

  • xi3

    wide 的框是怎么出来的?能介绍一下吗

  • 88250
    作者

    @xi3 可以使用 share 按钮,然后内嵌其他网站,比如个人博客

  • xi3

    找到了,原来在 help->playground 下面 https://wide.b3log.org/playground ,分享按钮就有各种方法,谢谢

  • toben

    非常好的教程,顺着看下来能懂

  • mymoshou

    今天开始看这个。 额,是从零开始的吧

  • zempty

    好像大家都很喜欢学习新语言哦!

  • myewage

    Java 还学不会呢。。go 还是先闪一边吧 :(

  • itfanr

    常量被编译器自动转换为自定义类型。

  • itfanr

    @xi3 你是怎么输出这个框的?我没有找到呢

  • itfanr
  • luol

    夫妻档配合的真好!!!

    1 回复
  • Vanessa
    捐赠者 支持者 赞助者

    可惜我还是没学 go。。。

  • mysusheng

    go 的语法太变态了,跟 py PHP 完全不是一类

  • mysusheng
  • imshf

    正在学习 go,在看视频学。同时也看看你这边。希望你这边可以每节后面出个课后作业,然后下一节给出标准答案,这样子会更好

  • imshf

    这样 run 会出错,需要放在 func 内部进行声明变量

    这样运行就 OK 了

  • cxgreat2014

    大大厉害!

    我想试着把 solo 在 go 实现一下,使用 Beego 框架不知道是不是个好主意,还是尽量自己实现更好一些呢?

    我先看看大大您的 Markdown 渲染服务的代码吧,期望尽量能和您的代码风格一致

    1 回复
  • 88250 1 1 赞同
    作者

    Go 实现博客系统可以参考 Pipe 😄

    1 回复
  • cxgreat2014

    好的,原来您已经实现了哈哈~已 Star 学习中

  • mymoshou

    当年其实是为了看这个来这里的,结果 Go 没学到,摸鱼倒是学会了

请输入回帖内容 ...