Go入门笔记
Posted 雪狐晨光
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go入门笔记相关的知识,希望对你有一定的参考价值。
《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 a
a=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,注意,该语句仅声明,不初始化channel
c := make(chan type_name) //创建一个无缓冲的type_name型的channel,无缓冲的channel当放入1个元素后,后续的输入便会阻塞
c := make(chan type_name, 100) //创建一个缓冲区大小为100的type_name型的channel
c <- 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 c
for 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 server
import (
"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入门笔记的主要内容,如果未能解决你的问题,请参考以下文章