教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 go学习记录--基础语法

go学习记录--基础语法

发布时间:2022-03-17   编辑:jiaochengji.com
教程集为您提供go学习记录--基础语法等资源,欢迎您收藏本站,我们将为您提供最新的go学习记录--基础语法资源
<blockquote>本期将go中的基础语法模块通过代码的方式写了一遍。
上传到了github.后续将不断通过更新项目总结go的学习以及总结。
下面的语法讲解转自golang官网,我简写了代码事例代码
golang官网:https://golang.google.cn/ref/...
golang开源社区:http://tour.studygolang.com/w... </blockquote>

代码地址:https://github.com/A1len/stud...


<h2>导读</h2> <ul><li>基础语法</li> <li>流程控制语句</li> </ul>
<h3>基础语法</h3> <blockquote>这一部分将对go中的包、函数、申明变量、基本数据类型、常量做一个描述</blockquote>
<h3>包</h3>

Go程序是通过将程序包关联在一起而组成。一个包又由一个或多个go源文件组成,这些源文件一起声明了属于该包的常量,类型,变量和函数,并且可以在同一包的所有文件中进行访问。这些元素可以 导出并在另一个包中使用。

<pre><code class="go">import ( "fmt" "math" ) //1.通过import的方式导入包,可以像java一样多个imprt导入 //也可以通过上述方式 ​ ​ ​ //2.在导入了一个包之后,就可以用其导出的名称来调用它。 //在 Go 中,首字母大写的名称是被导出的。 //Foo 和 FOO 都是被导出的名称。名称 foo 是不会被导出的。 //执行代码。然后将 math.pi 改名为 math.Pi 再试着执行一下 func main() { fmt.Println(math.Pi) } </code></pre>
<h3>函数</h3>

函数声明将标识符func绑定到函数。

<pre><code class="go"> package main ​ import ("fmt" "unsafe") ​ ​ //函数可以返回一个或者多个值,具体看add和multipl函数 //两个或多个连续的函数命名参数是同一类型,可以只需要最后一个参数定义类型 //Go 的返回值可以被命名,并且像变量那样使用。 //返回值的名称应当具有一定的意义,可以作为文档使用 //没有参数的 return 语句返回结果的当前值。也就是`直接`返回 func add(x int, y int)(int){ return x y } ​ func multiple(x , y int)(string ,int){ return "hello",x } ​ ​ func multiple2(x , y int)(str string ,z int){ str="hello" z=x return } ​ //外部实现,这里其实可以不定义结构体 //后续补充go:linkname func FlushICache(begin,end int) ​ ​ ​ func main() { x ,y :=multiple(42, 13) fmt.Print(x,y) ​ }</code></pre>
<h3>申明变量和常量</h3>

申明变量可以通过var或者:= 常量使用const

<pre><code class="go"> package main ​ import "fmt" ​ ​ //go当中声明一个变量可以通过var或者:= //var可以作用在函数中也可以函数外 //:=只可以在函数中 //go有自动类型推断,如果有初始值,可以不带上变量类型 ​ ​ var initname="allen" ​ ​ var name ,motherland string ​ var defaultvar string //常量的定义和变量类似,只是换成了const来申明 const Pi = 3.14 func main() { var num int age:=18 ​ ​ fmt.Println(defaultvar,num,age) ​ } ​</code></pre>
<h3>基本数据类型</h3> <pre><code class="go">package main ​ import ( "math/cmplx" "fmt" ) ​ /* bool ​ string ​ int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr ​ //一般需要用多大的可以选择多大的数字类型 //如果没有选择将会按照操作系统选择 //比如64位就会走int64 ​ ​ //go语言中的基础数据类型都有默认值, //这很正常引用指针得指向一个内存空间,才算初始化了一个变量 //否则一个指针不初始化,很容易造成基础数据类型空指针。。。有点尴尬 ​ byte // uint8 的别名 ​ rune // int32 的别名,因为unicode是动态的所以选择32位可以完全满足, 新版本java对于这一块做了自动判断,节省空间 ​ ​ float32 float64 ​ complex64 complex128 */ var ( ToBe bool = false MaxInt uint64 = 1<<64 - 1 z complex128 = cmplx.Sqrt(-5 12i) ) ​ func main() { const f = "%T(%v)\n" fmt.Printf(f, ToBe, ToBe) fmt.Printf(f, MaxInt, MaxInt) fmt.Printf(f, z, z) } ​</code></pre>
<h3>流程控制语句</h3> <blockquote>这部分没有全部列出来只是举了几个典型例子以及常用的说明,具体可以看官网</blockquote>
<h3>for</h3>

for的用法和java中基本一样,并且go里面是没有while了的

<pre><code class="go"> package main ​ import "fmt" ​ ​ //for的使用和java中基本是一样的,只是少了一个() //并且go当中没有while,使用for实现 //java中Doug Lea很喜欢这种写法 func main() { sum := 0 for i := 0; i < 10; i { sum = i } fmt.Println(sum) ​ i := 1 for i < 1000 { i = i } fmt.Println(i) ​ for { break } } ​ </code></pre>
<h3>switch</h3>

switch的变化比较多,没有条件的 switch 同 switchtrue一样。这一构造使得可以用更清晰的形式来编写长的 if-then-else 链 switch用法比java更方便灵活,不用显示的在语句中加break 如果要实现类似java的一个case成立继续执行后续的case可以使用fallthrough

<pre><code class="go"> package main ​ import ( "fmt" "runtime" "time" ) ​ ​ //switch用法比java更方便灵活,不用显示的在语句中加break //如果要实现类似java的一个case成立继续执行后续的case可以使用fallthrough //case也可以直接使用判断语句 ​ //以及type switch ​ //todo 后续看一下switch的实现源码 //感觉java的swtich语法糖和go比起来还是较弱,这也是java的历史原因 func main() { fmt.Print("Go runs on ") switch os := runtime.GOOS; os { case "darwin": fmt.Println("OS X.") //fallthrough 打开注释看看结果 case "linux": fmt.Println("Linux.") //fallthrough default: // freebsd, openbsd, // plan9, windows... fmt.Printf("%s.", os) } ​ ​ t := time.Now() switch { case t.Hour() < 12: fmt.Println("Good morning!") case t.Hour() < 17: fmt.Println("Good afternoon.") default: fmt.Println("Good evening.") } ​ ​ var a interface{} ​ a = "abc" ​ ​ ​ switch t := a.(type) { ​ case string: ​ fmt.Printf("string %s\n", t) ​ case int: ​ fmt.Printf("int %d\n", t) ​ default: ​ fmt.Printf("unexpected type %T", t) ​ } ​ } ​</code></pre>
<h3>defer</h3>

defer 语句会延迟函数的执行直到上层函数返回。延迟调用的参数会立刻生成,但是在上层函数返回前函数都不会被调用 可以理解为先进后出

<pre><code class="go">package main ​ import ( "fmt" ) ​ //defer的操作其实是一个压栈的方式调用 //先进后出FILO //可以一次执行下面的三个例子 ​ //另外通过例子3其实可以知道defer是有数据拷贝的 //换句话说执行defer的时候数据就保存了一个份 //后续变量怎么改变defer还是输出同样的信息 ​ //TODO defer的使用场景后续补充,暂时先当try catch finally使用 ​ ​ func main() { fmt.Println("counting") ​ a:="hello world" ​ for i := 0; i < 10; i { defer fmt.Println(i) } ​ fmt.Println("done") //1.os.Exit(0)//直接推出不会执行defer //2.return//遇到return才返回 defer fmt.Println(a) //3.a="hello defer" fmt.Println("done")//没有return则执行到底 } ​</code></pre> <blockquote>最后各位可以扫下方二维码关注我公众号,基本每周会推送一到两篇的go学习记录,后续学完基础语法,会准备写一个go微服务项目,源码依然放在github上面。</blockquote>

<span class="img-wrap"></span>

到此这篇关于“go学习记录--基础语法”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
Golang笔记:语法,并发思想,web开发,Go微服务相关
想系统学习GO语言(Golang
GO语言零基础从入门到精通视频教程
[go基础] go基础之字符串中查找汉字数量
请问没有任何编程基础,如何学习GO语言?
2018年最全Go语言教程零基础入门到进阶实战视频
[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及
零基础入门 go 语言
go学习记录--基础语法
Go语言发展历史、核心、特性及学习路线

[关闭]
~ ~