教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 GO语言从入门到达人--GO语言圣经--入门

GO语言从入门到达人--GO语言圣经--入门

发布时间:2022-02-07   编辑:jiaochengji.com
教程集为您提供GO语言从入门到达人--GO语言圣经--入门等资源,欢迎您收藏本站,我们将为您提供最新的GO语言从入门到达人--GO语言圣经--入门资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg>

1.Go的一些基本规范

<ul><li>GO是编译型语言。Go的工具链讲程序的源文件转变为机器相关的原生二进制</li><li>GO原生地支持Unicode,支持任何国家的语言。</li><li>GO语言其实由三部分组成 : 1.声明自己属于哪个包 package main
2.导入其他包 import (“fmt”)
3.程序本身 func main(){ 代码块 }
一般import后面是组成函数 – func 函数 const 常量 var 变量 type 类型
GO语言不适用分号进行结尾。</li></ul>


GO语言的" { "是不可以单独一行的,必须与func保持一致

总结一下:
GO语言的规范相对于比较固定,每次代码运行前都会由gofmt包进行代码规范检测,目前goland里面自带这种包,所以我们写出来通过编译的GO语言代码,都是通过规范的。

1.2命令行参数
举一个例子

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"fmt"</span> <span class="token string">"os"</span> <span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> s<span class="token punctuation">,</span>sep <span class="token builtin">string</span> <span class="token keyword">for</span> i<span class="token operator">:=</span><span class="token number">1</span><span class="token punctuation">;</span>i<span class="token operator"><</span><span class="token function">len</span><span class="token punctuation">(</span>os<span class="token punctuation">.</span>Args<span class="token punctuation">)</span><span class="token punctuation">;</span>i<span class="token operator"> </span><span class="token punctuation">{</span> s<span class="token operator"> =</span>sep <span class="token operator"> </span> os<span class="token punctuation">.</span>Args<span class="token punctuation">[</span>i<span class="token punctuation">]</span> sep <span class="token operator">=</span> <span class="token string">" "</span> <span class="token punctuation">}</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

var 关键字声明了两个string类型的变量s sep,GO语言声明变量时候,如果没有给定不过初始值。系统会默认给定初始值
1.数字类型默认值 0
2.字符串类型默认值 “”

<pre><code class="lang-go hljs"> <span class="token keyword">var</span> s<span class="token punctuation">,</span>sep <span class="token builtin">string</span> </code></pre>

GO语言中是不存在类似于C语言的 i操作,而for语言是GO语言唯一的for循环语句

那如果我想在GO语言使用while语句怎么办呢?

<pre><code class="lang-go hljs"><span class="token keyword">for</span><span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token comment">//这就while语句</span> <span class="token keyword">for</span><span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token comment">//这也是一个死循环,可以通过break return语句进行终止</span> </code></pre>

变量的声明方式

<pre><code class="lang-go hljs"> <span class="token keyword">var</span> s<span class="token punctuation">,</span>sep <span class="token builtin">string</span> <span class="token keyword">var</span> s <span class="token operator">=</span> <span class="token string">""</span> sep<span class="token operator">:=</span><span class="token string">""</span> <span class="token keyword">var</span> s <span class="token builtin">string</span> <span class="token operator">=</span> <span class="token string">""</span> </code></pre>

程序结构

如果一个函数名称是大写的是可以导出的,如果名称小写就是私有的简单粗暴

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">const</span> freezingF<span class="token punctuation">,</span>bollingF <span class="token operator">=</span> <span class="token number">32.0</span><span class="token punctuation">,</span><span class="token number">212.0</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%g℉=%g℃"</span><span class="token punctuation">,</span>freezingF<span class="token punctuation">,</span><span class="token function">fToc</span><span class="token punctuation">(</span>freezingF<span class="token punctuation">)</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%g℉=%g℃"</span><span class="token punctuation">,</span>bollingF<span class="token punctuation">,</span><span class="token function">fToc</span><span class="token punctuation">(</span>bollingF<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">fToc</span><span class="token punctuation">(</span> f <span class="token builtin">float64</span><span class="token punctuation">)</span><span class="token builtin">float64</span><span class="token punctuation">{</span> <span class="token keyword">return</span><span class="token punctuation">(</span>f <span class="token operator">-</span> <span class="token number">32</span><span class="token punctuation">)</span> <span class="token operator">*</span><span class="token number">5</span> <span class="token operator">/</span> <span class="token number">9</span> <span class="token punctuation">}</span> </code></pre>

声明一个函数的简单程序

变量
零值机制保障了所有的变量是良好的定义,GO里面不存在未初始化的变量
:= 局部变量尽量使用这个声明
指针
指针的值指向的是一个地址,一个指针指示值所保存的位置,不是所有值都是有地址,但是所有变量都有

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> x <span class="token operator">:=</span> <span class="token number">1</span> p <span class="token operator">:=</span><span class="token operator">&</span>x fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>p<span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token operator">*</span>p<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>


输出p就是x的地址 *p则是指针的值

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> p <span class="token operator">=</span> <span class="token function">f</span><span class="token punctuation">(</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>p<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">f</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span><span class="token builtin">int</span><span class="token punctuation">{</span> v <span class="token operator">:=</span><span class="token number">1</span> <span class="token keyword">return</span> <span class="token operator">&</span>v <span class="token punctuation">}</span> </code></pre> <ul><li>0xc0000a0090</li><li>0xc00000a0c8
第一次输出结果与第二次输出结果是不一样,说明指针的地址是不断变化的
关于flag命令行的简单介绍</li></ul><pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"flag"</span> <span class="token string">"fmt"</span> <span class="token string">"strings"</span> <span class="token punctuation">)</span> <span class="token keyword">var</span> n <span class="token operator">=</span> flag<span class="token punctuation">.</span><span class="token function">Bool</span><span class="token punctuation">(</span><span class="token string">"n"</span><span class="token punctuation">,</span><span class="token boolean">false</span><span class="token punctuation">,</span><span class="token string">"omit tralling newline"</span><span class="token punctuation">)</span> <span class="token keyword">var</span> sep <span class="token operator">=</span> flag<span class="token punctuation">.</span><span class="token function">String</span><span class="token punctuation">(</span><span class="token string">"s"</span><span class="token punctuation">,</span><span class="token string">" "</span><span class="token punctuation">,</span><span class="token string">"separator"</span><span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> flag<span class="token punctuation">.</span><span class="token function">Parse</span><span class="token punctuation">(</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Print</span><span class="token punctuation">(</span>strings<span class="token punctuation">.</span><span class="token function">Join</span><span class="token punctuation">(</span>flag<span class="token punctuation">.</span><span class="token function">Args</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token operator">*</span>sep<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token operator">!</span><span class="token operator">*</span>n<span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre>

flag.Bool判断是不是和预设值的命令参数匹配,如果是false输出后面的值
flag.String判断参数是否与预设的值相匹配,如果不匹配,则输出后面的值

new函数

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> p <span class="token operator">:=</span> <span class="token function">new</span><span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>p<span class="token punctuation">)</span> <span class="token operator">*</span>p <span class="token operator">=</span> <span class="token number">2</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token operator">*</span>p<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

new函数创建的是指针,和指针一样,new每次出来的地址都是不一样的

GO语言的GC机制

<blockquote>

每个包级别的变量和其他方式的引用可以找到变量。如果变量路径不存在,那么变量变得
不可访问,因此它不会其他的计算过程。
变量的生命周期是通过它是否可达来确定的

</blockquote>

赋值
左 = 右
多重赋值
x,y =y,x

类型声明

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">type</span> Celsius <span class="token builtin">float64</span> <span class="token keyword">type</span> Fahrenheit <span class="token builtin">float64</span> <span class="token keyword">const</span> <span class="token punctuation">(</span> AbsoluteZeroC Celsius <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">273.15</span> FreezingC Celsius <span class="token operator">=</span> <span class="token number">0</span> BollingC Celsius <span class="token operator">=</span> <span class="token number">100</span> <span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token function">CTof</span><span class="token punctuation">(</span>AbsoluteZeroC<span class="token punctuation">)</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token function">CTof</span><span class="token punctuation">(</span>FreezingC<span class="token punctuation">)</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token function">CTof</span><span class="token punctuation">(</span>BollingC<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">CTof</span><span class="token punctuation">(</span>c Celsius<span class="token punctuation">)</span>Fahrenheit<span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">Fahrenheit</span><span class="token punctuation">(</span>c<span class="token operator">*</span><span class="token number">9</span><span class="token operator">/</span><span class="token number">5</span> <span class="token operator"> </span> <span class="token number">32</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

包和文件
导入的包名 都是从$GOPATH/src/目录下面导入的
包的初始化,在所有包的初始化完毕后,main包才初始化
简述了。。

基本数据
整数:int int uint uintptr,unintptr其大小并不明确但是足够存放完整指针,所以用于底层编程

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> u <span class="token builtin">int8</span> <span class="token operator">=</span> <span class="token number">255</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>u<span class="token punctuation">,</span>u<span class="token operator"> </span><span class="token number">1</span><span class="token punctuation">,</span>u<span class="token operator">*</span>u<span class="token punctuation">)</span> <span class="token keyword">var</span> i <span class="token builtin">int8</span> <span class="token operator">=</span> <span class="token number">127</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>i<span class="token punctuation">,</span>i<span class="token operator"> </span><span class="token number">1</span><span class="token punctuation">,</span>i<span class="token operator">*</span>i<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

当整型超出范围,编译器无法通过编译。

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> apples <span class="token builtin">int16</span> <span class="token operator">=</span> <span class="token number">1</span> <span class="token keyword">var</span> orange <span class="token builtin">int64</span> <span class="token operator">=</span> <span class="token number">2</span> <span class="token keyword">var</span> fruit <span class="token operator">=</span> apples <span class="token operator"> </span> orange fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>fruit<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

这种写法是无法通过编译得,虽然是同样的int类型,但是位数不匹配,所以无法进行运算,但是我们将无法匹配得代码进行显示转换就可以进行运算了

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> apples <span class="token builtin">int16</span> <span class="token operator">=</span> <span class="token number">1</span> <span class="token keyword">var</span> orange <span class="token builtin">int64</span> <span class="token operator">=</span> <span class="token number">2</span> <span class="token keyword">var</span> fruit <span class="token operator">=</span> <span class="token function">int</span><span class="token punctuation">(</span>apples<span class="token punctuation">)</span> <span class="token operator"> </span> <span class="token function">int</span><span class="token punctuation">(</span>orange<span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>fruit<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

这就是可以的。
浮点数
GO具有两种大小的浮点数float32 float64,浮点值能方便地通过printf的谓词%g输出,该谓词会自动保持足够的精度,并选择简洁的方式,但是对于数据表,%e或%f的形式可能更适合
float32的有效数字大约有6位,float64的有效数字大约有15位,绝大多数情况下,优先选择float64

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> f <span class="token builtin">float32</span> <span class="token operator">=</span> <span class="token number">16777216</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>f <span class="token operator">==</span> f<span class="token operator"> </span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

这种展示的结果就是true
字符串
字符串是不可变的字节序列,它可以包含任意的数据,包括0值字节

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> s <span class="token operator">:=</span> <span class="token string">"hello world"</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token function">len</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span>s<span class="token punctuation">[</span><span class="token number">7</span><span class="token punctuation">]</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">:</span><span class="token number">5</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

到底不可变意味着什么呢?
答:不可变意味着两个字符串能安全地共用一段底层内存,使得赋值任何长度字符串的开销都是低廉的。类似地,字符串s及其子串可以安全地公用数据,因此字串生成的开销都低廉,这两种情况下都没有分配新的内存
复数

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> x <span class="token builtin">complex128</span> <span class="token operator">=</span> <span class="token function">complex</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token keyword">var</span> y <span class="token builtin">complex128</span> <span class="token operator">=</span> <span class="token function">complex</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>x<span class="token operator">*</span>y<span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token function">real</span><span class="token punctuation">(</span>x<span class="token operator">*</span>y<span class="token punctuation">)</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token function">imag</span><span class="token punctuation">(</span>x<span class="token operator">*</span>y<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

real取得实部 imag取得虚部
这一章虽然东西很多,可是我懒得写了。。。

到此这篇关于“GO语言从入门到达人--GO语言圣经--入门”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
想系统学习GO语言(Golang
go run main.go 参数_Go语言入门:Hello world
Golang笔记:语法,并发思想,web开发,Go微服务相关
Go 语言一本通
从零开始学习GO语言-搭建Go语言开发环境-快速开发入门第一个小程序
Go语言的主要特性和发展影响
[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及
Go 语言十年而立,Go2 蓄势待发
golang url 收集
Go语言发展历史、核心、特性及学习路线

[关闭]
~ ~