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. 用画布canvas画安卓logo

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. SSM项目引入文件失败

    <mvc:resources mapping="/styles/**" location="/css/"/> <mvc:resources m ...

  3. jQuery实现购物车计算价格功能的方法

    本文实例讲述了jQuery实现购物车计算价格功能的简易方法,做的比较简单,现分享给大家供大家参考.具体如下: 目的: <%@ page language="java" con ...

  4. 关于js中的原型

  5. Linux安装部署

    Linux桌面发行版 UbuntuCentOSRed heat LinuxOracle Linux 一.系统安装 1.系统分区 若手动分区swap和根分区必须创建,推荐创建boot分区. /----- ...

  6. centos6.8安装mysql过程

    1.验证Centos是否安装MySQL $>yum list installed | grep mysql 2.删除MySql $>yum –y remove mysql-libs.X86 ...

  7. CAP通俗解释

    CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),这三个基本需求,最多只 ...

  8. 树莓派 ubuntu16.04 安装SSH 配置SSH 开机自启SSH

    入手个树莓派3B 装了 ubuntu 16.04 需要用到SSH 记录下 0.先获得树莓派IP 树莓派 使用网线连接路由器和树莓派 在路由器设置页面(一般是192.168.1.1具体看路由器的型号和设 ...

  9. ubuntu 和windows 分别在anaconda上安装tensorflow

    windows下 的anaconda安装tensorflow: 在Anaconda Prompt中:conda install tensorflow python=3.5一直下载失败.总结一下原因可能 ...

  10. 20155206 实验一《Java开发环境的熟悉》实验报告

    实验内容 使用JDK编译.运行简单的Java程序 使用IDEA 编辑.编译.运行.调试Java程序. 实验代码 `import java.text.DecimalFormat; import java ...