相信大家在看编程语言学习教程的时候都会难免觉得有点枯燥: 自己看书,遇到问题不方便求助 书上的代码片段、示例是静态的 虽然有时书上会给出运行输出,但是不够直观 自己拷贝代码到 IDE 里运行是也比较麻烦 即使运行了也要来回在 IDE 和书之间切换,还是麻烦 总之,[链接] 如果能 边看边练 就会舒服很多,书上的示例代码 ..

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

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

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

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

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

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

光说不练假把式,上货!


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
)

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

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



社区小贴士

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

打赏 50 积分后可见  
50 积分 • 14 打赏
  • golang

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

    320 引用 • 1158 回帖 • 731 关注
  • 教程
    78 引用 • 344 回帖 • 3 关注
  • 雨痕
    14 引用 • 62 回帖 • 3 关注
       
1 操作
88250 在 2019-05-23 16:00:42 置顶了该帖
26 回帖   
请输入回帖内容...
  • noah  

    nice

  • Vanessa  

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

    1 回复
  • An

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

  • youngski  

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

  • sparon  

    👍 一直比较看好 go

  • jama  

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

  • someone API  

    我也要在我的博客中使用 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 了

请输入回帖内容 ...