服务器端语言go之开篇分享
由于之前看过其他脚本语言,此时看服务器端语言go语法时也短短用了半天的时间,如图1所示,是个人学习go语法的目录截图,学习网址:菜鸟网站,为了个人方便学习和记忆,因此写下本篇文章,在本篇文章里我主要是针对目录中的项做以简单的理解并加以示例展示,可能不利于没有任何编程功底的同学学习,本人之前做过C++开发3年,这篇文章仅仅作为个人学习之用,记录的功能可能会比较零散,如果有想系统学习go语法的同学直接上菜鸟网站学习即可。
图1 go语法看点
1、语言教程
Go 是一个开源的编程语言。Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。
2、环境安装
windows下下载msi文件,双击即可安装。安装包下载地址为:https://golang.org/dl/。
3、结构
包声明、引入包、函数、变量、语句 & 表达式、注释。执行go文件使用go run *.go
4、数据类型
布尔、数字、字符串和派送类型(指针、数组、结构体、Channel、函数、切片、接口和Map)。关于派生类型后边会有详细介绍
5、变量
var identifier type。例如:var a [type]= "w3cschool菜鸟教程"
6、常量
const identifier [type] = value。例如:const b string = "abc"
7、运算符
和C++一样
8、条件语句
类似于C++,多一个select语句。select 语句类似于 switch 语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。switch case分支无break
9、循环语句
类似于C++,多一个goto语句。goto语句将控制转移到被标记的语句。for融合了while功能
- 1 // The most basic type, with a single condition.
- 2 i := 1
- 3 for i <= 3 {
- 4 fmt.Println(i)
- 5 i = i + 1
- 6 }
- 7
- 8 // A classic initial/condition/after `for` loop.
- 9 for j := 7; j <= 9; j++ {
- 10 fmt.Println(j)
- 11 }
- 12
- 13 // `for` without a condition will loop repeatedly
- 14 // until you `break` out of the loop or `return` from
- 15 // the enclosing function.
- 16 for {
- 17 fmt.Println("loop")
- 18 break
- 19 }
- 20
- 21 // You can also `continue` to the next iteration of
- 22 // the loop.
- 23 for n := 0; n <= 5; n++ {
- 24 if n%2 == 0 {
- 25 continue
- 26 }
- 27 fmt.Println(n)
- 28 }
10、函数
函数是基本的代码块,用于执行一个任务。Go 语言最少有个 main() 函数。函数支持多个返回值
- func function_name( [parameter list] ) [return_types] {
- 函数体
- }
11、变量作用域
局部变量、全局变量和形式参数。形式参数为函数参数
12、数组
和C++一样。例如:var variable_name [SIZE] variable_type,类型写在最后
13、指针
Go 语言的取地址符是 &,一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址。指针声明格式:var var_name *var-type,例如:var ip *int /* 指向整型*/,当一个指针被定义后没有分配到任何变量时,它的值为 nil。
14、结构体
结构体定义需要使用 type 和 struct 语句,结构体的格式如下:
- type struct_variable_type struct {
- member definition;
- member definition;
- ...
- member definition;
- }
一旦定义了结构体类型,它就能用于变量的声明,语法格式如下:
- variable_name := structure_variable_type {value1, value2...valuen}
15、切片
切片是对数组的抽象。数组的长度不可改变,数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。一个未指定大小的数组来定义切片,例如:var identifier []type,切片不需要说明长度。使用make()函数来创建切片:
- var slice1 []type = make([]type, len)
- //也可以简写为
- slice1 := make([]type, len)
- //也可以指定容量,其中capacity为可选参数。
- make([]T, length, capacity)
16、范围
range 关键字用于for循环中迭代数组(array)、切片(slice)、链表(channel)或集合(map)的元素。在数组和切片中它返回元素的索引值,在集合中返回 key-value 对的 key 值。
- nums := []int{, , }
- sum :=
- for _, num := range nums {
- sum += num
- }
17、Map
map类似于C++ stl中的map,无序,可以使用内建函数 make 也可以使用 map 关键字来定义 Map:
- /* 声明变量,默认 map 是 nil */
- var map_variable map[key_data_type]value_data_type
- /* 使用 make 函数 */
- map_variable = make(map[key_data_type]value_data_type)
如果不初始化 map,那么就会创建一个 nil map。nil map 不能用来存放键值对
- var countryCapitalMap map[string]string
- /* 创建集合 */
- countryCapitalMap = make(map[string]string)
18、递归函数
函数定义参考10小节函数定义,递归函数同C++中用法一样。以下实例通过 Go 语言的递归函数实例阶乘:
- package main
- import "fmt"
- func Factorial(x int) (result int) {
- if x == {
- result = ;
- } else {
- result = x * Factorial(x - );
- }
- return;
- }
- func main() {
- var i int =
- fmt.Printf("%d 的阶乘是 %d\n", i, Factorial(i))
- }
19、类型转换
类型转换用于将一种数据类型的变量转换为另外一种类型的变量。形如:type_name(expression)
20、接口
Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。
- /* 定义接口 */
- type interface_name interface {
- method_name1 [return_type]
- method_name2 [return_type]
- method_name3 [return_type]
- ...
- method_namen [return_type]
- }
- /* 定义结构体 */
- type struct_name struct {
- /* variables */
- }
- /* 实现接口方法 */
- func (struct_name_variable struct_name) method_name1() [return_type] {
- /* 方法实现 */
- }
- ...
- func (struct_name_variable struct_name) method_namen() [return_type] {
- /* 方法实现*/
- }
使用样例:
- package main
- import (
- "fmt"
- )
- type Phone interface {
- call()
- }
- type NokiaPhone struct {
- }
- func (nokiaPhone NokiaPhone) call() {
- fmt.Println("I am Nokia, I can call you!")
- }
- type IPhone struct {
- }
- func (iPhone IPhone) call() {
- fmt.Println("I am iPhone, I can call you!")
- }
- func main() {
- var phone Phone
- phone = new(NokiaPhone)
- phone.call()
- phone = new(IPhone)
- phone.call()
- }
21、错误处理
Go 语言通过内置的错误接口提供了非常简单的错误处理机制。错误接口理解可以参考上一小节接口来进行理解。使用方法:
- package main
- import (
- "fmt"
- )
- // 定义一个 DivideError 结构
- type DivideError struct {
- dividee int
- divider int
- }
- // 实现 `error` 接口
- func (de *DivideError) Error() string {
- strFormat := `
- Cannot proceed, the divider is zero.
- dividee: %d
- divider:
- `
- return fmt.Sprintf(strFormat, de.dividee)
- }
- // 定义 `int` 类型除法运算的函数
- func Divide(varDividee int, varDivider int) (result int, errorMsg string) {
- if varDivider == {
- dData := DivideError{ //dData类型根据右侧类型自动判断为error接口
- dividee: varDividee,
- divider: varDivider,
- }
- errorMsg = dData.Error()//返回DivideError重写后的Error方法返回值
- return
- } else {
- return varDividee / varDivider, ""
- }
- }
- func main() {
- // 正常情况
- if result, errorMsg := Divide(, ); errorMsg == "" {
- fmt.Println("100/10 = ", result)
- }
- // 当被除数为零的时候会返回错误信息
- if _, errorMsg := Divide(, ); errorMsg != "" {
- fmt.Println("errorMsg is: ", errorMsg)
- }
- }
执行以上程序,输出结果为:
- / =
- errorMsg is:
- Cannot proceed, the divider is zero.
- dividee:
- divider:
服务器端语言go之开篇分享的更多相关文章
- Language Guide (proto3) | proto3 语言指南(开篇)
前言 近日在学习gRPC框架的相关知识时接触到Protobuf(protocol-buffers,协议缓冲区),proto3等知识.网上很多文章/帖子经常把gRPC与proto3放在一起,为避免初学者 ...
- Go语言并发编程示例 分享(含有源代码)
GO语言并发示例分享: ppt http://files.cnblogs.com/files/yuhan-TB/GO%E8%AF%AD%E8%A8%80.pptx 代码, 实际就是<<Go ...
- C语言dos程序源代码分享(进制转换器)
今天给大家分享一个dos程序的源代码 这个程序是本人在学习中的经验分享 如果有问题或者建议,欢迎大家一起交流 源代码: /*本程序为一个进制转换器 本程序不作为商业用途,完全为技术交流 喜欢C语言的同 ...
- 服务器端架构及实战 — C#分享
简介 此文是我2008年读研究生期间做的C#项目技术分享,给计算机专业学生的一些经验分享. 当时工作2年后读研. 计算机基础了解及介绍 了解计算机的核心课程和大家的理解 二进制的历史和原理 数字逻辑及 ...
- C/C++编程笔记:流行的数字游戏【2048】,C语言400行源代码分享
游戏介绍 你玩过2048吗?2048是一款流行于各大网页和手机的数字游戏,手机安卓版推出的是<挑战2048>,之后的版本中还加入了双人对战的游戏模式,更加受到玩家的热捧. 2048的游戏规 ...
- C语言课设心得分享(一)
今儿上完课设,老师果然讲的比较少,周四还不用去,看来还是学生自己折腾.我在做课设的过程中,攒了一些心得/体会,希望能和大家分享分享,也希望能一起探讨探讨.如果是我能回答的问题,我很乐意能够提供帮助. ...
- 【Android 多语言切换简单实例分享】
一.Android多语言切换 Android应用的开发不可能仅仅针对某一个国家或者区域使用,各国间语言文化各不同样,因此一个优秀的APP必须支持多种语言,为了实现这个特性,Android给出了一个解决 ...
- R语言学习网站(分享)
1. https://www.r-bloggers.com/ 2. https://www.kaggle.com/datasets 3. RStudio download: https://www.r ...
- [知识库分享系列] 四、ASP.NET MVC and Winform
知识库分享系列: [知识库分享系列] 三.Web(高性能Web站点建设) [知识库分享系列] 二..NET(ASP.NET) [知识库分享系列] 一.开篇 分享介绍本篇分享两个知识库节点,分别为“AS ...
随机推荐
- JAVA基础面试(五)
41.a.hashCode() 有什么用?与 a.equals(b) 有什么关系? hashCode() 方法对应对象整型的 hash 值.它常用于基于 hash 的集合类,如 Hash ...
- 实现基于tomcat集群会话保持
1.实验环境 我们需要准备两台虚拟机,把这两台虚拟机组成集群,实现会话保持. 2.配置server1 2.1 修改nginx配置文件 [root@server1 ~]# vim /etc/nginx/ ...
- CSS实现模糊效果
HTML代码如下: <body> <h1>body设置了模糊效果</h1> <div id="aa"></div> &l ...
- webpack 3.X学习之JS压缩与打包HTML文件
js压缩 webpack自带一个插件uglifyjs-webpack-plugin来压缩js,所以不需要再次安装,当一切都准备妥当,引入uglifyjs-webpack-plugin模块: const ...
- 最大信息系数(MIC)——Detecting Novel Associations in Large Data Sets
本文介绍了一种发现两个随机变量之间依赖关系强度的度量MIC(最大信息系数,类似于相关系数的作用).MIC具有以下性质和优势: MIC度量具有普适性.其不仅可以发现变量间的线性函数关系,还能发现非线性函 ...
- ASP.NET没有魔法——ASP.NET Identity 的“多重”身份验证
ASP.NET Identity除了提供基于Cookie的身份验证外,还提供了一些高级功能,如多次输入错误账户信息后会锁定用户禁止登录.集成第三方验证.账户的二次验证等,并且ASP.NET MVC的默 ...
- Java 执行CMD/DOS
最近在写一个自己的邮箱服务器里用到 监视及起/停 windows 中的服务,调查发现还是得用dos来做这些事情 说一下遭遇战的过程 首先是java里如何执行DOS命令,查到下记函数 Runtime.g ...
- sqlserver的四种分页方式
第一种:ROW_NUMBER() OVER()方式 select * from ( select *, ROW_NUMBER() OVER(Order by ArtistId ) AS RowId f ...
- 布局神器display:flex
2009年,W3C提出了一种新的方案--Flex布局,可以简便.完整.响应式地实现各种页面布局.目前已得到所有现在浏览器的支持. flex浏览器支持 一.Flex布局是什么? Flex是Flexi ...
- CCF-201403-2-窗口
问题描述 试题编号: 201403-2 试题名称: 窗口 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平 ...