Go语言特性
1.入口,go有且只有一个入口函数,就是main函数
liteide (IDE)的 一个工程(文件夹)只能有且只有一个main函数
package main import "fmt" // 入口函数
func main () {
fmt.Println("hello world")
}
package main import "fmt" // 入口函数
// { 左括号必须和函数同行,不然异常
func main ()
{
fmt.Println("hello world")
}
2. 调用函数
// go语言以包作为管理单位
// 每个文件必须先声明包
// 程序必须要有一个main包
package main import "fmt" // 入口函数
func main () { // 左括号必须和函数名同行
// 打印
// "hello go"打印到屏幕, Println()会直到换行
// 调用函数,大部分都需要导入包
/*
块注释
*/
fmt.Println("hello world") // go 语句结尾没有分号;
}
go build xxx.go // 编译后生成xxx.exe,不运行 go run xxx.go // 编译后直接运行,不生成xxx.exe
gofmt xxx.go 代码格式化 gofmt -w xxx.go 格式化后写入文件
golang语言特性
1. 垃圾回收
a. 内存自动回收,再也不需要开发人员管理内存
b. 开发人员专注业务实现,降低了心智负担
c. 只需要new分配内存,不需要释放
2. 天然并发
a. 从语言层面支持并发,非常简单
b. goroute,轻量级线程,创建成千上万个goroute成为可能
c. 基于CSP(Communicating Sequential Process)模型实现
func main() {
go fmt.Println(“hello")
}
3.channel
a. 管道,类似unix/linux中的pipe
b. 多个goroute之间通过channel进行通信
c. 支持任何类型
func main() {
pipe := make(chan int,3)
pipe <- 1
pipe <- 2
}
实现线程间管道通信
全局变量pipe
package main import "fmt" // pipe是个全局变量 ,会有问题 多线程共用值会被改变,要加锁处理
var pipe chan int // 声明一个管道int类型 func add(a int, b int) {
var sum int
sum = a + b pipe <- sum // 把sum放进管道
} func main() {
pipe = make(chan int, 1) // 初始化创建一个管道
go add(2,5) // goroute 调用add
sum :=<- pipe // 这段代码会阻塞到pipe里有值取出
fmt.Println("sum=", sum)
}
传参的方式 pipe
package main import "fmt" // c作为pipe形参
func add(a int,b int, c chan int) {
sum := a+b // 等价 var sum int 后赋值 c <- sum // 把sum放进管道
} func main(){
pipe :=make(chan int, 1) // 初始化创建一个管道 go add(2, 5, pipe) // 将pipe作为参数传入 sum :=<-pipe // 这段代码会阻塞到pipe里有值取出
fmt.Println("sum=" , sum)
}
4. 多返回值
a. 一个函数返回多个值
func calc(a int, b int)(int,int) {
sum := a + b
avg := (a+b)/2
return sum, avg
}
package main import "fmt" func calc(a int, b int) (int, int) {
c := a + b
d := (a + b) / 2
return c, d
} func main() {
sum, _ := calc(100, 200) // _ 不想要的值
fmt.Println("sum=", sum)
}
包的概念
go编码 utf-8
1. 和python一样,把相同功能的代码放到一个目录,称之为包
2. 包可以被其他包引用
3. main包是用来生成可执行文件,每个程序只有一个main包
4. 包的主要用途是提高代码的可复用性
项目路径 project/src/go_dev/day1/example1/hello.go 编译 D:/project> go build go_dev/day1/example1 // go bulid 默认找src下的路径 不要带src 生成 D:/project> examp1.exe 在 project/下直接可以运行
包的导入
项目路径 D:\project\src\go_dev\day1\package_example下
包 calc
D:\project\src\go_dev\day1\package_example\calc 下有
add.go
package calc // 要被其他包导入要首字母大写
func Add(a int, b int) int {
return a + b
}
sub.go
package calc // 要被其他包导入要首字母大写
func Sub(a int, b int) int {
return a - b
}
包 main
D:\project\src\go_dev\day1\package_example\main 下有 main.go
package main import (
"fmt"
"go_dev/day1/package_example/calc"
) func main() {
sum := calc.Add(100,200)
sub := calc.Sub(100,300) fmt.Println("sum=", sum)
fmt.Println("sub=", sub)
}
编译
D:\project> go build go_dev/day1/package_example/main
编译到指定路径 D:\project\bin
D:\project> go build -o bin/xxx.exe go_dev/day1/package_example/main
Go语言特性的更多相关文章
- C# 3.0新语言特性和改进(一)
引言 关于C#3.0的特性,园子里已经有了一大把,可能大家都很熟悉了,虽然本人开发中使用过,但自己还是需要记录一下,总结一下.同时也是后面写Linq知识的基础.希望有兴趣的朋友,可以看看. C# 3. ...
- 【转】浅思OC的语言特性
算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...
- Pro ASP.NET MVC –第四章 语言特性精华
C#语言有很多特性,并不是所有的程序员都了解本书我们将会使用的C#语言特性.因此,在本章,我们将了解一下作为一个好的MVC程序员需要了解C#语言的特性. 每个特性我们都只是简要介绍.如果你想深入了解L ...
- 浅思OC的语言特性
算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...
- XAML 名称范围 (x:) 语言特性
本节介绍为 Windows 运行时实现的 XAML 语言特性的参考信息. 本部分内容 主题 描述 x:Class 属性 配置 XAML 编译,在标记和代码隐藏之间连接分部类.代码分部类在一个独立的代码 ...
- C++ 语言特性的性能分析
转载:http://www.cnblogs.com/rollenholt/archive/2012/05/07/2487244.html 大多数开发人员通常都有这个观点,即汇编语言和 C 语 ...
- C# 动态语言特性,dynamic 关键字研究
1 动态语言简介 支持动态特性的语言现在大行其道,并且有继续增长的趋势.比如 Ruby 和 Python, 还有天王级的巨星 --- JavaScript. 现在一个程序员说自己对 Jav ...
- 理解Javascript的动态语言特性
原文:理解Javascript的动态语言特性 理解Javascript的动态语言特性 Javascript是一种解释性语言,而并非编译性,它不能编译成二进制文件. 理解动态执行与闭包的概念 动态执行: ...
- c#跟objective-c语言特性
c#跟objective-c语言特性的对比 拿c#语言跟objective-c做个对比,记录下自己认为是差不多的东西. 学过objc的人相信对category这个东西肯定不陌生,它可以让我们在没有源码 ...
- Scala中的语言特性是如何实现的(3) -- Trait
我的新博客地址:http://cuipengfei.me/blog/2013/10/13/scala-trait/ 我在Coursera上跟了一门叫做Functional Programming Pr ...
随机推荐
- golang的slice作为函数参数传值的坑
直接贴代码 func sliceModify(slice []int) { // slice[0] = 88 slice = append(slice, ) } func main() { slice ...
- (转)jdbc 调用 sql server 的存储过程时“该语句没有返回结果集”的解决方法
本文转载自:http://hedyn.iteye.com/blog/856040 在JDBC中调用SQL Server中的存储过程时出现如下异常: com.microsoft.sqlserver.jd ...
- (转)Inno Setup入门(十九)——Inno Setup类参考(5)
本文转载自:http://blog.csdn.net/yushanddddfenghailin/article/details/17251019 单选按钮 单选按钮在安装中也很常见,例如同一个程序可以 ...
- python学习(二十五) 链表方法
# 链表 cars = ['a', "b"] print(cars) # 链表长度 print(len(cars)) # 结尾添加元素 cars.append("c&qu ...
- SpringMVC传统风格控制器和基于注解的控制器
SpringMVC的DispatcherServlet 之前说过springMVC是使用Servlet作为控制器,就是这个用于调度的DispatcherServlet了.这个是servlet,可以根据 ...
- 【UVA】10763 Foreign Exchange(map)
题目 题目 分析 没什么好说的,字符串拼接一下再放进map.其实可以直接开俩数组排序后对比一下,但是我还是想熟悉熟悉map用法. 呃400ms,有点慢. 代码 #include < ...
- 10_java之继承和抽象类
01继承的概述 *A:继承的概念 *a:继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系 *b:在Java中,类的继承是指在一个现有类的基础上去构建一个新的类, 构建出来的新 ...
- windows共享连接显示无法打开
Ping目标地址和名称可以连通,但是访问告知无法打开或找到名称,看凭据设置正常,重启无效. 判断:可能是由于凭据过期引起,更新凭据,重启,仍旧无效. 修改IP地址进行访问,成功打开. 清理网络连接状态 ...
- Mysql 源码编译安装 ( 5.5 、5.6 共存 )
简介: 如何在一台服务器同时运行两 ( 多 ) 个 MySQL 服务. 1.MySQL 5.6 shell > useradd -r -s /sbin/nologin mysql shell & ...
- PHP - 闭包Closure和lambda function
现在的语言没有闭包简直都不好意思说出来. 想要了解闭包是什么,那么就必须知道匿名函数.其实看起来他们其实差不多一个意思. 见php RFC一句话: End of 2007 a patch was ...