不一样的go语言-一样的语法
前言
上一篇入门篇算是初识庐山真面目,我们知道了一个go程序的构成,在这里总结一下。
//包名
package
//导入包
import "fmt"
//main方法,程序入口
func main() {
//程序主体
fmt.Println("Hello World!")
}
那么,作为一个经验丰富的程序员,接下来很自然地就是看看它的语法是怎么样的,怎么声明变量、常量,有哪些数据类型,有哪些运算符,有哪些控制语句,有哪些数据结构,怎么使用函数,还有注释、转义等等。
当然,作为OO,还会涉及如何定义接口、类,如何创建对象。但下面的内容只会对go语法作一个全览,不作深入探究。更多的细节或者我觉得比较有趣的内容留待后面的文章中探讨。比如go的变量声明为什么设计成名字在前类型在后,为什么go没有三元操作符等等。
行分隔
一行代表一个语句结束,不需要使用分号结尾。
同时go源码格式是语言规范的一部分,并提供了 gofmt工具格式化代码,因此团队协作时,不需要担心格式式模板的问题。
注释
//单行注释
/*
* 块注释
*/
转义
go语言的转义符是\,其他没有什么特别的。
变量&常量
//声明整型变量a
var a int
//声明整型变量a,并赋初值1
var a = 1
//声明整型变量a,并赋初值1
a := 1
//多变量声明
var a, b int
var a, b = 123, 456 //同类型
c, d := 111, "abc" //不同类型
var (
a int
b string
)
//声明常量
const a int = 1
const b = 1
const (
c string = "abc"
d := 1
)
const (
x = iota //0
y //1, 自动加1
z //2, 自动加1
)
可以看出,变量的声明名称在前,类型在后。而对于不同的数据类型或结构,初值及初始化语法有所差别。此差别会在下文中可以看到。
数据类型
名称 | 说明 |
---|---|
布尔类型 | bool,值true or false |
数字类型 | 包括整型(int,uint,uintptr,byte,rune,uint8,uint16,uint32,uint64,int8,int16,int32,int64)、浮点型(float32,float64,complex64,complex128) |
字符类型 | 即字符串类型,采用UTF-8编码 |
派生类型 | 包括指针,数组,切片,map,结构,通道,函数,接口 |
其中数字类型区分了有符号类型、无符号类型,同时还细分了位数。go号称性能高,如果没有这些细分的数据类型,恐怕就不好吹牛B了。
运算符
名称 | 说明 |
---|---|
算术运算符 | +, -, *, /, %, ++, -- |
关系运算符 | ==, !=, >, <, >=, <= |
逻辑运算符 | &&, ||, ! |
位运算符 | &, |, ^(异或), >>, << |
赋值运算符 | =, +=, -=, *=, /=, %=, <<=, >>=, &=, |
其他运算符 | &(取地址), *(指针) |
运算符倒没什么特别的,该有的都有,除了三元操作符
控制语句
//if语句
a := 1
if a == 1 {//if条件是不带括号的,除了复合条件
fmt.Println("a==1")
} else if a < 1 {
fmt.Println("a<1")
} else {
fmt.Println("a>1")
}
//switch语句
b := "abc"
switch b {
case "abc":
fmt.Println("abc")
case "xyz":
fmt.Println("xyz")
case "hello", "world":
fmt.Println("Hello World")
default:
fmt.Println("unknown")
}
//type-switch,用于类型判断
swithc b.(type) {
case int:
fmt.Println("int")
case string:
fmt.Println("string")
default:
fmt.Println("unknown")
}
//select语句,常用于channel通信
var c1, c2 chan int
select {
case <- c1:
fmt.Println("c1")
case <- c2:
fmt.Println("c2")
default
fmt.Println("none")
}
//如果没有 default,select语句会从可用的case中公平随机地选择一个,否则阻塞直至某个 case可用
//case都不可用且有default时,选择default分支
//for循环
for i := 1; i < 10; i++ {
fmt.Println(i)
}
i := 1
for {
if i >= 10 {
break
}
fmt.Println(i)
i++
}
array := [2]int{1,2}
for index, value := range array {
fmt.Printf("index: %d, value: %d", index, value)
}
看起来多了select语句,但少了while语句。但其for语句的可用性显著地高于其他语言。
数据结构
//声明指针
var a *int
//声明int数组
var array [2]int
array[0] = 1
var array2 = [3]int{1,2,3}
var array3 = [...]int{1,2}
//数组访问
b := array2[0] //第1个元素
c := array2[1:2] //c = [2]int{2,3}
d := array2[1:] //d = [2]int{2,3}
e := array2[:2] //e = [2]int{1,2}
//数组遍历
for index, value := range array2 {
}
//_表示忽略返回值
for _, value := range array2 {
}
//声明切片(相当于Java的List)
var slice []int //相当于List<Integer>
slice = make([]int, 2) //相当于new ArrayList<Integer>(2)
var slice2 []int = make([]int, 2)
slice3 := make([]int, 2)
//切片的访问与数组一样
//声明map
var map1 map[string]string
map1 = make(map[string]string, 2) //相当于new HashMap<String, String>(2)
var map2 map[string]string = make(map[string]string, 2)
map3 := make(map[string]string, 2)
//map 赋值
map3["a"] = "a"
map3["b"] = "b"
//map 访问
ma := map3["a"] //ma = a
//map 遍历
for key, value := range map3 {
}
//判断元素是否存在
if exists, value := map3["a"]; exists {
}
//声明 struct,可认为是go语言的类定义
type House struct {
Area float32
Price int64
}
//struct 构建
h := House{}
h.Area = 120.0
h.Price = 30000
h1 := House{Area: 120.0, Price: 30000}
函数
package main
import "fmt"
//函数声明
func foo() string {
return "bar"
}
//函数声明2
func foo2(value string) (string, error) {
return bar + value, nil
}
//函数调用
func main() {
fmt.Println(foo())
if r, err := foo2("xyz"); err != nil {
fmt.Println(r)
}
}
到此为止,go的基础语法已经罗列完毕。这些都是绝大多数语言的共性,除了表达方式上有所不同之外,所有的这些元素都是一门编程语言不可或缺的。总的来说,名字在前,类型在后,语句无分号,判断无括号,其他无两样。
如果说go有什么不一样的话,那确实有许多不一样之处,留待下回细说。
请关注公众号
不一样的go语言-一样的语法的更多相关文章
- C语言-01-基本语法
一.学前需知 开发工具 windows平台:Visual C++6.0等 mac平台:Xcode6.0等 以下文章内容皆是以Xcode6.0为开发工具,clang编译器. Xcode的一些常用快捷键 ...
- 关于JS脚本语言的基础语法
JS脚本语言的基础语法:输出语法 alert("警告!"); confirm("确定吗?"); prompt("请输入密码");为弱 ...
- Xamarin XAML语言教程基础语法篇大学霸
Xamarin XAML语言教程基础语法篇大学霸 前 言 Xamarin是一个跨平台开发框架.它可以用来开发iOS.Android.Windows Phone和Mac的应用程序.使用Xamarin框 ...
- Cocos2d-x 脚本语言Lua基本语法
Cocos2d-x 脚本语言Lua基本语法 前面一篇博客对Lua这门小巧的语言进行了简单的介绍.本篇博客来给大家略微讲一下Lua的语法.不会长篇累牍得把Lua的全部语法都讲一遍,这里通过下面几点来讲L ...
- GO语言的基本语法之变量,常量,条件语句,循环语句
GO语言的基本语法之变量,常量,条件语句,循环语句 作为慕课网得笔记自己看 定义变量: 使用var关键字 var a, b, C bool var s1, s2 string = "hell ...
- tn文本分析语言(二) 基本语法
tn是desert和tan共同开发的一种用于匹配,转写和抽取文本的语言.解释器使用Python实现,代码不超过1000行. 本文主要介绍tn的基本语法.高级内容可以参考其他篇章.使用这样的语法,是为了 ...
- (转)JavaScript二:JavaScript语言的基本语法要求
摘自:http://blog.csdn.net/erlian1992 要学习好JavaScript,首先我们要懂JavaScript语言的一些基本语法要求: 一,区分大小写 JavaScript语言区 ...
- javaweb学习总结七(XML语言作用、语法)
一:XML语言的概念以及作用 1:xml概念:extensible Markup language,可扩展行标记语言,因为html的语法比较混乱,不够严谨. 用html写的系统不好维护,所以w3c组织 ...
- C语言-01基础语法
1) 总结常见文件的拓展名 .c 是C语言源文件,在编写代码的时候创建 .o 是目标文件,在编译成功的时候产生 .out 是可执行文件,在链接成功的时候产生 2) 总结 ...
- C#语言不常用语法笔记
只看过3天C#语法书,了解个大概,与C++等不同之处,或者看开源遇到一些奇异用法,记录一下,脑子不够用的情况下,还是记笔记靠谱. ==================== 顺便吐槽下,这年头得会各种编 ...
随机推荐
- python(七) Python中单下划线和双下划线
Python中单下划线和双下划线: 一.分类 (1).以单下划线开头,表示这是一个保护成员,只有类对象和子类对象自己能访问到这些变量. 以单下划线开头的变量和函数被默认是内部函数,使用from mod ...
- Java对象与JSON互相转换jsonlib以及手动创建JSON对象与数组——(二)
首先声明一下,jsonlib转换与GSON相比太差劲了,操作不是一般的繁琐.GSON可以直接转换成各种集合与对象类型.强烈推荐使用GSON.而且GSON一个方法就可以解决,jsonlib转来转去太繁琐 ...
- 【转】Python之数据序列化(json、pickle、shelve)
[转]Python之数据序列化(json.pickle.shelve) 本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型 ...
- TypeError: 'range' object does not support item assignment
TypeError: 'range' object does not support item assignment I was looking at some python 2.x code and ...
- 嵌入式系统C编程之堆栈回溯
前言 在嵌入式系统C语言开发调试过程中,常会遇到各类异常情况.一般可按需添加打印信息,以便观察程序执行流或变量值是否异常.然而,打印操作会占用CPU时间,而且代码中添加过多打印信息时会显得很凌乱.此外 ...
- Kernel 3.0.8 内存管理函数【转】
转自:http://blog.csdn.net/myarrow/article/details/7208777 1. 内存分配函数 相关代码如下: #define alloc_pages(gfp_ma ...
- 异步编程之使用yield from
异步编程之使用yield from yield from 是 Python3.3 后新加的语言结构.yield from的主要功能是打开双向通道,把最外层的调用方法与最内层的子生成器连接起来.这两者就 ...
- redis拾趣(客户端连接,keys命令,数据备份,缓存有效期等)
1.客户端连接 为了安全保护,redis支持绑定IP跟端口,这个通过conf配置文件中的bind跟port来设置. 绑定后登录client控制台时就需要写明ip(或者hostname)跟端口了,如: ...
- linux 内核是什么?
一:linux系统如何构成的?User space:User Applications and GNU C library (glibc)kernel space:System Call interf ...
- Qt Ubuntu 编译出错-1: error: 找不到 -lGL
安装好,编译界面程序出错“-1: error: 找不到 -lGL” 在终端运行如下命令(安装Qt5.8.0) sudo apt-get install libqt5-dev sudo apt-get ...