Go入门笔记
来源:互联网 发布:经济通行情软件 编辑:程序博客网 时间:2024/06/03 22:25
《Go程序设计语言》作者Kerninghan教授与谷歌GO开发团队核心成员联合编写,Go语言编程圣经。本笔记是学习翻阅此书中文翻译版,整理而成。 非常感谢李道兵、 高博等辛苦的翻译。
Go IDE-Golang 使用入门参考如下。
https://www.2cto.com/kf/201704/632395.html
Go语言简介
【1】Go语言是编译型语言。Go 的工具链将程序的源文件转变成机器相关的二进制指令。Go代码是使用包来组织的,包类似于其他语言的模块。一个包由一个或者多个go文件组成,放在同一个文件夹中,文件夹的名字描述了包的作用。每一个源文件的开始都使用package声明,指明了这个文件属于哪个包。
【2】import 必须在package声明后面,import导入声明后面是组成程序的函数、变量、常量、类型(func、var、const、type)开头声明。大部分情况下声明的顺序是没有关系的。
【3】Go不需要在语句或者声明后面使用分号结尾,除非有多个语句或者声明出现在同一行。Go代码格式化要求非常严格。
【4】Go不允许存在无用的变量或者无用的包导入,不然会出现编译错误。如果有些变量返回必须需要变量占位,可以使用空标识符”_”。空标识符可以用在任何语法需要变量名但是程序逻辑不需要的地方,例如丢掉每次迭代产生的无用的索引。
【5】“:=”是Go语言中特有的短变量声明和初始化,更加简洁,但是通常在一个函数的内部使用,不适合包级别的变量。
// = 使用必须使用先var声明例如:var aa=100//或var b = 100//或var c int = 100// := 是声明并赋值,并且系统自动推断类型,不需要var关键字d := 100
进程 线程 协程
进程:独立的栈空间,独立的堆空间,进程之间调度由os完成。
线程:独立的栈空间,共享堆空间,内核线程之间调度由os完成。
协程:独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的。
goroutine-channel-select
参考链接:http://blog.csdn.net/qwertyupoiuytr/article/details/55101258
goroutine:原生支持语言级并发,这个并发的最小逻辑单元就是goroutine。goroutine就是Go语言提供的一种用户态线程,这种用户态线程是跑在内核级线程之上的,goroutine在运行时的调度是由Go语言提供的调度器来进行的,创建一个goroutine使用关键字go,go创建的goroutine不会阻塞主线程:
go func_name()
channel:Channel是Go中的一个核心类型,可以把它看成一个管道,通过它可以发送或者接收数据进行通讯(communication)。配合goroutine,形成了一种既简单又强大的请求处理模型。
channel的基本操作:
var c chan int //声明一个int类型的channel,注意,该语句仅声明,不初始化channelc := make(chan type_name) //创建一个无缓冲的type_name型的channel,无缓冲的channel当放入1个元素后,后续的输入便会阻塞c := make(chan type_name, 100) //创建一个缓冲区大小为100的type_name型的channelc <- x //将x发送到channel c中,如果channel缓冲区满,则阻塞当前goroutine<- c //从channel c中接收一个值,如果缓冲区为空,则阻塞x = <- c //从channel c中接收一个值并存到x中,如果缓冲区为空,则阻塞x, ok = <- c //从channel c中接收一个值,如果channel关闭了,那么ok为false(在没有defaultselect语句的前提下),在channel未关闭且为空的情况下,仍然阻塞close(c) //关闭channel cfor term := range c {} //等待并取出channelc中的值,直到channel关闭,会阻塞单向channel:var ch1 chan<- float64 //只能向里面写入float64的数据,不能读取var ch2 <-chan int //只能读取int型数据
select:select用于在多个channel上同时进行侦听并收发消息,当任何一个case满足条件时即执行,如果没有可执行的case则会执行default的case,如果没有指定defaultcase,则会阻塞程序,select的语法:
func TestChannel(){ // For our example we'll select across two channels. c1 := make(chan string) c2 := make(chan string) // Each channel will receive a value after some amount // of time, to simulate e.g. blocking RPC operations // executing in concurrent goroutines. go func() { time.Sleep(time.Second * 1) c1 <- "one" }() go func() { time.Sleep(time.Second * 2) c2 <- "two" }() // We'll use `select` to await both of these values // simultaneously, printing each one as it arrives. for i := 0; i < 2; i++ { select { case msg1 := <-c1: fmt.Println("received", msg1) case msg2 := <-c2: fmt.Println("received", msg2) } }}
Go Web简单例子
package serverimport ( "net/http" "fmt" "log" "ch01/lissajous")func Server1() { http.HandleFunc("/", handler) log.Fatal(http.ListenAndServe("localhost:8000", nil))}func handler(w http.ResponseWriter,r *http.Request) { fmt.Fprintf(w,"URL.PATH = %q\n",r.URL.Path) lissajous.Lissajous(w)}
- Go入门笔记
- go 语言入门笔记
- Go语言学习笔记 --- 入门介绍
- GO入门
- go 入门
- go笔记
- Go笔记
- 【Go学习笔记】Hello Go!
- go 语言入门
- Go语言入门资料
- go语言入门
- Go 1.0.3 入门
- go语言入门
- Go语言1-入门
- Go语言入门
- Go语言编程入门
- 1.Go 入门
- GO-入门准备
- Linux作业
- Spark调优第一篇
- Python学习笔记(1)——Python学习笔记以及概述
- 用proteus来仿真74ls283加法器------计算机加法的基础
- 原码反码和补码详解
- Go入门笔记
- Android: AndroidKeyStore 非对称RSA加密解密
- yang模型初解
- JDK安装与环境变量的配置
- java IO笔记(PushbackInputStream)
- 应用性能优化
- 使用AndroidStudio进行系统应用开发
- Kotlin基本类型
- 六级_第三天