golang笔记1

  • go代码是用包来组织的,每个包有一个或多个go文件组成,这些go文件文件放在一个文件夹中
  • 每个源文件开始都用一个package声明,指明本源文件属于哪个包
  • pakage声明后紧跟这导入其他包
  • 导入包之后,是构成源文件的变量、函数、类型生命等
  • go语言不需要在语句后家分号
  • import时,左括号‘(’要跟import在一行
  • 函数的的左花括号'{' 必须跟func关键词在一行

下面这段代码是一个完整的GO程序

package main

import(
"fmt"
) func main(){
fmt.Println("hello world")
}

命令行参数

os包中提供了一些函数与变量与操作系统打交道。os.Args变量中存储命令行参数。

os.Args是一个字符串slice变量(字符串数组),可以直接print该值

package main

import (
"fmt"
"os"
) func main() {
fmt.Println(os.Args)
fmt.Println(os.Args[1])
}

找出重复行

在输入中找不重复的行

// 打印输入中输入次数大于1的行
package main import (
"bufio"
"fmt"
"os"
) func main() {
count := make(map[string]int)
input := bufio.NewScanner(os.Stdin) for input.Scan() {
if(input.Text() == ""){
break
}
count[input.Text()]++
} for line, num := range count {
if num > 1 {
fmt.Printf("%d\t%s\n", num, line)
}
}
}

map存储一个键值对组合,提供常量时间的操作来存储、获取、测试集合中的元素。键是可以进行相等比较的任意类型,字符串是最常见的键类型。值可以是任意类型。

map的创建使用make语句

	count := make(map[string]int)

bufio包可以有效的处理输入输出,bufio.Scanner可以读取输入,以行或者单词为间隔。

下面这行代码表示从标准输入进读取,每次调用input.Scan()读取下一行,并且将结尾的换行去掉;调用input.Text()获取读到的内容。

	input := bufio.NewScanner(os.Stdin)
for input.Scan(){
fmt.Println(input.Text())
}

除了从标准输入中处理,更为广泛的是从文件中的输入内容中处理,下面代码实现了从文件中读取

// 打印输入中输入次数大于1的行
package main import (
"bufio"
"fmt"
"os"
) func main() {
count := make(map[string]int) files := os.Args[1:] if len(files) == 0 {
countLines(os.Stdin, count)
} else {
for _, arg := range files {
f, err := os.Open(arg)
if err != nil {
fmt.Fprintf(os.Stderr, "dup err: %v\n", err)
continue
}
countLines(f, count)
f.Close()
}
} for line, num := range count {
if num > 1 {
fmt.Printf("%d\t%s\n", num, line)
}
}
} func countLines(f *os.File, count map[string]int) {
input := bufio.NewScanner(f) for input.Scan() {
if input.Text() == "" {
break
}
count[input.Text()]++
}
}

首先在命令行参数中读取文件名,然后用os.Open()打开,此处返回的值是(f, err),f 的类型是*os.File的指针类型。这里跟c语言中的标准流一样。

	// files是输入文件名数组
_, files := os.Args[1:] // 对每一个输入的文件进行读取, arg是每个文件的名字
// f是文件指针
for _,arg := files {
f, err := os.Open(arg)
countLines(f, count)
f.Close()
}

还需要注意的是,map是对make创建的数据结构的引用。** 当一个map被传递给一个函数时,函数接收到这个引用的副本,所有调用函数对map改变时,调用者使用的map也会产生改变。**这类似与C语言中的指针调用。

上面读取文件的方式是“流”的模式读取,用法与c语言中的文件流类似。原理上来说,可以用这种方式处理大量数据。

一个可选方式是一次读取一整块数据到大块内存,一次性的分割所有行,后面使用这种方式处理该问题。

// 打印输入中输入次数大于1的行
package main import (
"bufio"
"fmt"
"io/ioutil"
"os"
"strings"
) func main() {
count := make(map[string]int) files := os.Args[1:] if len(files) == 0 {
countLines(os.Stdin, count)
} else {
for _, arg := range files {
data, err := ioutil.ReadFile(arg)
if err != nil {
fmt.Fprintf(os.Stderr, "dup err: %v\n", err)
continue
}
for _, line := range strings.Split(string(data), "\n") {
count[line]++
}
}
} for line, n := range count {
if n > 1 {
fmt.Printf("%d\t%s\n", n, line)
}
} } func countLines(f *os.File, count map[string]int) {
input := bufio.NewScanner(f) for input.Scan() {
if input.Text() == "" {
break
}
count[input.Text()]++
}
}

这里是一次将全部的文件数据读入,然后根据"\n"将数据分割为行。

	//读取文件内容到data
data,err := ioutil.ReadFile(file) //按行分割
strings.Split(string(data), "\n")

GIF动画

package main

import (
"image"
"image/color"
"image/gif"
"io"
"log"
"math"
"math/rand"
"net/http"
"os"
"time"
) var palette = []color.Color{color.White, color.Black} const (
whiteIndex = 0
blackIndex = 1
) func main() {
rand.Seed(time.Now().UTC().UnixNano())
if len(os.Args) > 1 && os.Args[1] == "web" {
handler := func(w http.ResponseWriter, r *http.Request) {
lisajous(w)
}
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe("localhost:8000", nil))
return
}
lisajous(os.Stdout)
} func lisajous(out io.Writer) {
const (
cycles = 5
res = 0.001
size = 100
nframes = 64
delay = 8
)
freq := rand.Float64() * 3.0
anim := gif.GIF{LoopCount: nframes}
phase := 0.0
for i := 0; i < nframes; i++ {
rect := image.Rect(0, 0, 2*size+1, 2*size+1)
img := image.NewPaletted(rect, palette)
for t := 0.0; t < cycles*2*math.Pi; t += res {
x := math.Sin(t)
y := math.Sin(t*freq + phase)
img.SetColorIndex(size+int(x*size+0.5), size+int(y*size+0.5), blackIndex)
}
phase += 0.1
anim.Delay = append(anim.Delay, delay)
anim.Image = append(anim.Image, img)
}
gif.EncodeAll(out, &anim)
}

golang笔记1的更多相关文章

  1. Golang笔记(二)面向对象的设计

    Golang笔记(二)面向对象的设计 Golang本质还是面向过程的语言,但它实现了一些OOP的特性,包括抽象.封装.继承和多态. 抽象和封装 Golang和C语言一样以struct为数据结构核心,不 ...

  2. Golang笔记(一)简洁的语言风格

    Golang笔记(一)简洁的语言风格 概述 Golang继承了很多C语言的风格,寡人使用了十几年C语言,切换到Golang时上手很快,并且随着深入的使用,越来越喜欢这门语言.Golang最直观的感受是 ...

  3. Golang笔记集

    学习Golang了, 下面分享我的, 还有我收集的Golang的学习资料 我的基础笔记地址: https://github.com/zhuchangwu/go-study-notes 其他参考: Go ...

  4. Golang笔记整理--One day

    题外话: 很早就有整理学习笔记的想法,今天将想法付诸于行动,将Golang相关知识系统整理一遍,此分类为Golang学习笔记,最近开始学习这门语言的同学可以参考. 一 第一个Go程序: hello.g ...

  5. golang笔记——函数与方法

    如果你遇到没有函数体的函数声明,表示该函数不是以Go实现的. package math func Sin(x float64) float //implemented in assembly lang ...

  6. golang笔记——IDE

    可选方案有 Lite IDE\GoSublime\Visual Studio Code\Goclipse\Vim 1.Lite IDE 这是国人开发的开源且跨平台的 golang 专属IDE,也算是目 ...

  7. golang笔记——包

    1.包简述 GO本身没有项目的概念,只有包,包括可执行包和不可执行包,而不管什么包,都应该包含在 $GOPATH/src 目录下,GO命令和编译器会在 $GOPATH/src 目录下搜索相应的包.比如 ...

  8. golang笔记——环境搭建

    1.下载安装 从 https://golang.org/dl/ 这里下载最新版本的 golang 安装包,分别有 Windows\Linux\Apple OSX\源码包. golang的官方网站是 h ...

  9. 【Golang笔记】Golang工具包Cobra安装记录

    0.环境信息 系统:Win10_x64 Go版本:go version go1.8.1 windows/amd64 Git版本:git version 2.17.0.windows.1 1.安装Go运 ...

随机推荐

  1. Java编写画图板程序细节-保存已画图形

    没有Java编写画图板程序细节-保存已画图形   一.为何我们要保存画图板上已画图形呢? 有很多人会问,为什么我们一定要保存画图板上已经画好了的图形呢?原因很简单.当我们在画图板上画完自己想画的图形后 ...

  2. javascript设计模式系列二-封装

    JavaScript封装: var Book = function (id, name, price) { this.id = id, this.name = name, this.price = p ...

  3. vue 项目中px转rem转换问题(postcss-px2rem)

    1.安装postcss-px2rem npm install postcss-px2rem --save npm install postcss-px2rem --save 2.配置px2rem 在配 ...

  4. C语言数据结构与算法之深度、广度优先搜索

    一.深度优先搜索(Depth-First-Search 简称:DFS) 1.1 遍历过程: (1)从图中某个顶点v出发,访问v. (2)找出刚才第一个被顶点访问的邻接点.访问该顶点.以这个顶点为新的顶 ...

  5. Asp.Ner Core定时任务

    AspNet Core定时任务 纪念人类首张黑洞照片发布 第一种方式BackgroundService 基于后台服务类BackgroundService实现,类所在命名空间Microsoft.Exte ...

  6. PMP考试总结

    9月8日参加完PMP考试,从上第一次课7月14日到考试,历经56天.5次面授课,3次模考,对整个项目管理有了清晰的认识和学习.感觉上课是一回事,做题又是一回事,考试又是另外一回事.考试一共4个小时,从 ...

  7. 重学Verilog(1)

    1.线与.线或功能 wor module WO(A, B, C, D, WireOR) input A,B,C,D; output WireOr; wor WireOr; assign WireOr ...

  8. 20155212 2016-2017-2 《Java程序设计》第4周学习总结

    20155212 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 Chapter 6 继承基本上就是避免多个类间重复定义共同行为. private成员会被继承 ...

  9. 20155327 信息安全技术 实验二 Windows口令破解

    课程:信息安全概论 班级:1553 姓名:了李百乾 学号:20155327 成绩: 指导教师: 李冬冬 实验日期及时间: 2017年10月11日 15:30-18:00 必修/选修:必修 实验序号:0 ...

  10. 假期C语言学习笔记4

    函数 经过三个星期的慕课的学习大致上学会了C的一些基本知识,在经过三个星期的C语言课本实践将书上的例题,课后练习实践挨个做了一遍,终于到了函数这一章.时间过的好快呀. 函数分为库函数和自定义函数:有返 ...