Go语言基础(一)

国庆体验一下大名鼎鼎的Go语言,IDE使用IEDA+Go插件,边敲代码边体会,感觉Go语言好酷

一、Hello World

和Java类似,go文件需要一个package包含,代码结构如下:

main

└── hello.go

// 包声明
// 每个Go应用程序都包含一个main的包,表示可以独立执行的程序
package main // 引入包,fmt提供格式化IO
import "fmt" // 函数
func main() {
/* 这是我的第一个Hello World程序 */
fmt.Println("Hello World") // 首字母大写表示暴露给外部使用
}

运行

go run hello.go

二、基本数据类型

类型和描述
布尔型 布尔型的值只可以是常量 true 或者 false。一个简单的例子:var b bool = true。
数字类型 整型 int 和浮点型 float,Go 语言支持整型和浮点型数字,并且原生支持复数,其中位的运算采用补码。
字符串类型: 字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使用UTF-8编码标识Unicode文本。
派生类型: 包括: (a) 指针类型(Pointer) (b) 数组类型 (c) 结构化类型(struct) (d) 联合体类型 (union) (e) 函数类型 (f) 切片类型 (g) 接口类型(interface) (h) Map 类型 (i) Channel 类型

三、变量&常量

和C语言用法类似,但又动态语言的感觉,直接上代码:

// 包声明
// 每个Go应用程序都包含一个main的包,表示可以独立执行的程序
package main // 引入包,fmt提供格式化IO
import "fmt" // 自动判断类型
var a = "Test"
var b = 10 // 连续声明多变量
var x, y int
var (
c float32 = 1.25
d bool = false // 这个bool其实可以省略
) // 函数
func main() {
// 调用默认的打印方法
fmt.Println(a, b)
x, y = 4, 5
x, y = y, x // 交换,和Python写法一致
_, y = 100, 200 // _为只写变量,处理没用的返回值 fmt.Println(c, d, x, y) t:=1 // 声明变量的简写形式,只能用在函数内部,不能在全局
const PI = 3.14 // 常量
fmt.Println(&t, PI) // C语言的取地址
}

运行结果:

Test 10
1.25 false 5 200
0xc420084040 3.14

四、基本运算符

和C语言几乎一样

package main

import "fmt"

func main()  {
a := 21
b := 10 // 算术运算符
fmt.Println("a + b = ", a + b)
fmt.Println("a - b = ", a - b)
fmt.Println("a * b = ", a * b)
fmt.Println("a / b = ", a / b)
fmt.Println("a % b = ", a % b)
a ++
fmt.Println("a ++ = ", a)
a --
fmt.Println("a -- = ", a) // 关系运算&逻辑运算
fmt.Println("a < b = ", a < b)
fmt.Println("a < b || a > 0 = ", a > b || a > 0) // 位运算
fmt.Println("a ^ b = ", a ^ b)
fmt.Println("a | b = ", a | b)
fmt.Println("a & b = ", a & b) // 赋值运算
a += 2
fmt.Println("a += 2 = ", a)
b <<= 2
fmt.Println("b <<= 2 = ", b)
}

运行结果:

a + b =  31
a - b = 11
a * b = 210
a / b = 2
a % b = 1
a ++ = 22
a -- = 21
a < b = false
a < b || a > 0 = true
a ^ b = 31
a | b = 31
a & b = 0
a += 2 = 23
b <<= 2 = 40

五、条件分支

if和switch和C类似,select还不了解细节

package main

import "fmt"

func main() {
a := 10
// if语句
if a > 20 {
fmt.Println("a > 20")
} else {
fmt.Println("a <= 20")
} // switch语句,不用break分隔,默认只会执行一个case
// 如果要执行多个case,使用fallthrough关键字,然后用break终止
var x interface{} switch xType := x.(type) {
case nil:
fmt.Println("类型", xType)
case int:
fmt.Println("类型为int")
case float64:
fmt.Println("类型为float64")
case func(int) float64:
fmt.Println("类型为func(int) float64")
case bool, string:
fmt.Println("类型为bool或string")
default:
fmt.Println("未知类型")
} // select语句
// 每个case是一个通信,每个channel的表达式都会被求值
// 所有channel表达式都会被求值
// 如果任意某个通信可以进行,它就执行;其他被忽略
// 如果有多个case都可以运行,Select会随机公平地选出一个执行。其他不会执行
// 否则:
// 如果有default子句,则执行该语句
// 如果没有default字句,select将阻塞,直到某个通信可以运行;Go不会重新对channel或值进行求值 var c1, c2, c3 chan int
var i1, i2 int
select {
case i1 = <-c1:
fmt.Println("received ", i1, "from c1")
case c2 <- i2:
fmt.Println("sent ", i2, " to c2")
case i3, ok := <-c3:
if ok {
fmt.Println("received ", i3, "from c3")
} else {
fmt.Println("c3 is closed")
}
default:
fmt.Println("no communication")
}
}

运行结果:

a <= 20
类型 <nil>
no communication

六、循环语句

go语言的循环只保留了for语句,控制语句break,continue、goto和C一样

package main

import "fmt"

func main() {
// 指定次数
var s = 0
for i:=1; i<=5; i++ {
s += i
}
fmt.Println("s = ", s) // while
var a = 1
var b = 3
for a < b {
a ++
fmt.Println("a = ", a)
} // 无限循环
var t = 0
for {
t ++
if t > 3{
break
}
fmt.Println("t = ", t)
}
}

运行结果:

s =  15
a = 2
a = 3
t = 1
t = 2
t = 3

七、定义函数

基本用法与C相同,不过增加了一些动态性

package main

import "fmt"

// 基本用法
func max(num1, num2 int) (string, int) {
if num1 > num2 {
return "max num: ", num1 // 返回多个值
} else {
return "max num: ", num2
}
} type Circle struct {
radius float64
} // 函数方法的用法,getArea绑定接收者Circle
func (c Circle) getArea() float64 {
return 3.14 * c.radius * c.radius
} // 使用匿名函数实现闭包,可以使用外部变量而不必声明
// 注意这里返回一个匿名函数func int
func getSequence() func() int{
// 这里模拟了C语言的静态变量
i := 0
return func() int {
i += 1
return i
}
} func main() {
// 函数可以作为值来传递
op := max
fmt.Println(op(100, 200)) // 函数方法
var c1 Circle
c1.radius = 10
fmt.Println("Area of Circle(c1) = ", c1.getArea()) // 闭包
nextNum := getSequence()
fmt.Println(nextNum())
fmt.Println(nextNum())
fmt.Println(nextNum()) nextNum2 := getSequence() // 创建另一个函数,重新计数
fmt.Println(nextNum2())
fmt.Println(nextNum2())
}

运行结果

max num:  200
Area of Circle(c1) = 314
1
2
3
1
2

Go语言基础(一)的更多相关文章

  1. 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(下)

    索引: 一.SQL Server的体系结构 二.查询 三.表表达式 四.集合运算 五.透视.逆透视及分组 六.数据修改 七.事务和并发 八.可编程对象 五.透视.逆透视及分组 5.1 透视 所谓透视( ...

  2. 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(上)

    索引: 一.SQL Server的体系结构 二.查询 三.表表达式 四.集合运算 五.透视.逆透视及分组 六.数据修改 七.事务和并发 八.可编程对象 一.SQL Server体系结构 1.1 数据库 ...

  3. C#语言基础

    第一部分 了解C# C#是微软公司在2000年7月发布的一种全新且简单.安全.面向对象的程序设计语言,是专门为.NET的应用而开发的.体现了当今最新的程序设计技术的功能和精华..NET框架为C#提供了 ...

  4. C语言基础回顾

    第一章 C语言基础 1.  C语言编译过程 预处理:宏替换.条件编译.头文件包含.特殊符号 编译.优化:翻译并优化成等价的中间代码表示或汇编代码 汇编:生成目标文件,及与源程序等效的目标的机器语言代码 ...

  5. 黑马程序员_ C语言基础(二)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 概览 今天基础知识分为以下几点内容(注意:循环.条件语句在此不再赘述):   1.Hello W ...

  6. C#语言基础— 输入与输出

    C#语言基础— 输入与输出 1.1函数的四要素:名称.输入.输出.加工 1.2主函数:输出语句.输入语句: Static viod Main(string[] stgs)//下划线部分可以自己指定 { ...

  7. 【GoLang】GO语言系列--002.GO语言基础

    002.GO语言基础 1 参考资料 1.1 http://www.cnblogs.com/vimsk/archive/2012/11/03/2736179.html 1.2 https://githu ...

  8. R语言基础:数组&列表&向量&矩阵&因子&数据框

    R语言基础:数组和列表 数组(array) 一维数据是向量,二维数据是矩阵,数组是向量和矩阵的直接推广,是由三维或三维以上的数据构成的. 数组函数是array(),语法是:array(dadta, d ...

  9. OC语言基础知识

    OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能 ...

  10. Java学习总结(二)----Java语言基础

    1.     Java语言基础 2.1 关键字 定义:被java语言赋予特殊含义的单词 特点:关键字中的字母都为小写 用于定义数据类型的关键字 class,interface,byte,short,i ...

随机推荐

  1. nginx的信号量

    一.官方文档 https://www.nginx.com/resources/wiki/start/topics/tutorials/commandline/ 二.nginx进程说明 一般在nginx ...

  2. Chrome浏览器中autocomplete="off"不起作用解决方案

    多数浏览器默认会缓存input的值,只有使用ctl+F5强制刷新的才可以清除缓存记录. 如果不想让浏览器缓存input的值,有2种方法: 方法一: 在不想使用缓存的input中添加 autocompl ...

  3. 第五节:WebApi的三大过滤器

    一. 基本说明  1. 简介: WebApi下的过滤器和MVC下的过滤器有一些区别,首先我们要注意的是通常建WebApi项目时,会自动把MVC的程序集也引入进来,所以我们在使用WebApi下的过滤器的 ...

  4. 初步认识Promise

    在解释什么是Promise之前,先看一道练习题,做完练习题也就知道Promise到底是干嘛用的了. 假设现在有个需求:你要封装一个方法,我给你一个要读取文件的路径,你这个方法能帮我读取文件,并把内容返 ...

  5. 最大熵模型和EM算法

    一.极大似然已经发生的事件是独立重复事件,符合同一分布已经发生的时间是可能性(似然)的事件利用这两个假设,已经发生时间的联合密度值就最大,所以就可以求出总体分布f中参数θ 用极大似然进行机器学习有监督 ...

  6. nginx——location匹配流程图

    location匹配流程图 location理解 1.收到url请求后,nginx首先进行精确匹配(有“=”的为精确匹配),如果匹配成功,则直接返回精确匹配结果,如果没有命中则会继续向下进行普通匹配 ...

  7. Python- redis缓存 可达到瞬间并发量10W+

    redis是什么? mysql是一个软件,帮助开发者对一台机器的硬盘进行操作. redis是一个软件,帮助开发者对一台机器的内存进行操作. redis缓存 可达到瞬间并发量10W+ 高并发架构系列:R ...

  8. 进入django

    web应用,c/s,b/s架构 c/s: 客户端 服务端 b/s: 浏览器 服务器 HTTP协议: 超文本传输协议 四大特性: 1.基于TCP/IP作用在应用层之上的协议 2.基于请求响应 3.无状态 ...

  9. 在python中使用print()时,raw write()返回无效的长度:OSError: raw write() returned invalid length 254 (should have been between 0 and 127)

    写出一个不是code的bug,很烦恼,解决了挺长时间,都翻到外文来看,不过还是解决了,只尝试了一种简单可观的方法,希望对大家有用 我正在使用Django与Keras(tensorflow)来训练一个模 ...

  10. 金蝶K/3 审批相关SQL语句

    金蝶K/3 审批相关SQL语句 --http://127.0.0.1/lightApp/todocheckTask.aspx?AccID=84&&FClasstypeID=1071&a ...