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

最新文章

  1. 获取文件mime类型
  2. Rafy 领域实体框架示例(1) - 转换传统三层应用程序
  3. VMware 虚拟上网的的三种模式 ——bridged、host-only、NAT 模式
  4. Build better apps: Windows 10 by 10 development series
  5. Linux 命令行生成随机密码的十种方法
  6. web前端基础知识及快速入门指南
  7. Android 父类super.onDestroy();的有关问题
  8. 参数TFilterPredicate 类型说明
  9. 【Zookeeper】源码分析之Watcher机制(一)
  10. 字符串匹配之boyer-Moore算法
  11. RabbitMq在CentOs7下的完整安装步骤,带你踩坑
  12. Vim使用技巧:特定文件类型关联缩进
  13. 什么是CMD
  14. jdk_1_8_1
  15. Python学习--11 面向对象高级编程
  16. 查看Linux 版本
  17. python数据类型高阶
  18. iText使用经历
  19. 安卓的SlidingMenu配置
  20. 【刷题】BZOJ 5008 方师傅的房子

热门文章

  1. STL 算法罗列 (转)
  2. eclipse Mars(4.5.2)安装pydev后不出现
  3. 第一章 先把Kubernetes跑起来
  4. Oracle参数修改是否需要重启等
  5. Protobuf3教程
  6. Deep Learning 学习笔记(9):主成分分析( PCA )与 白化( whitening )
  7. C# 生成序号不足补0
  8. html——网页高度
  9. RHCE7 学习里程-1.配置IP,DNS
  10. UGUI 学习