惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
Cyberwarzone
Cyberwarzone
L
LINUX DO - 最新话题
N
News and Events Feed by Topic
T
Troy Hunt's Blog
Help Net Security
Help Net Security
S
Security @ Cisco Blogs
Google DeepMind News
Google DeepMind News
Security Archives - TechRepublic
Security Archives - TechRepublic
M
MIT News - Artificial intelligence
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V2EX - 技术
V2EX - 技术
Y
Y Combinator Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
大猫的无限游戏
大猫的无限游戏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Microsoft Security Blog
Microsoft Security Blog
Cisco Talos Blog
Cisco Talos Blog
T
Threatpost
Recent Commits to openclaw:main
Recent Commits to openclaw:main
S
SegmentFault 最新的问题
I
InfoQ
H
Hacker News: Front Page
D
Docker
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Blog — PlanetScale
Blog — PlanetScale
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
Netflix TechBlog - Medium
AWS News Blog
AWS News Blog
Know Your Adversary
Know Your Adversary
博客园 - 【当耐特】
T
Tor Project blog
U
Unit 42
H
Heimdal Security Blog
Microsoft Azure Blog
Microsoft Azure Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
P
Privacy & Cybersecurity Law Blog
PCI Perspectives
PCI Perspectives
美团技术团队
O
OpenAI News
T
Tailwind CSS Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
B
Blog
GbyAI
GbyAI
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
MyScale Blog
MyScale Blog

陈少文的网站

巨变与机遇的未来十年 Kubernetes 平台管理软件压力测试方案 使用镜像部署 Hexo 静态页面 终于等到你 - GitHub 镜像仓库服务(ghcr.io) 一起来学 Go --(6)Interface 一起来学 Go --(5)Goroutine 和 Channel 什么是函数式编程 如何在 Kubernetes 集群集成 Kata 柯里化与偏函数 使用 PyGithub 自动创建 Label 软件产品是团队能力的输出 Helm 2 、Helm 3 比较 IoT 变现 Kubernetes 中的 DNS 服务 国内的 Helm 镜像源 Harbor 使用自签证书支持 Https 访问 DevOps 工具链之 Prow 如何使用 kfctl 安装 Kubeflow VS Code 无法下载 Go 插件的工具包 工程师更应具有服务精神 你不知道的 Docker 使用技巧 使用 Docker 运行 Tensorflow 论中国 什么是左移 如何清空 Git 仓库全部历史记录 一禅小和尚 有风吹过厨房 时间的玫瑰 如何在 CentOS 安装 GPU 驱动 开发 Tips(19) 使用 Velero 备份 Kubernetes 集群 Kubernetes Cheat Sheet 开发 Tips(18) 如何构建一个 Java 工程 开发 Tips(17) KubeSpray 安装 Kubernetes 报错 ip in ansible_all_ipv4_addresses 基于 Kubernetes 和 Jenkins 搭建自动化测试系统 在 Kubernetes 上动态创建 Jenkins Slave 使用 Jenkins 进行服务拨测 开发 Tips(16) Kubernetes 签发 Ingress 证书及日常故障运维 Kubernetes 中 Deployment 的基本操作 Kubernetes 中的证书 如何使用 KubeBuilder 开发一个 Operator Kubernetes 1.6.0 安装问题汇总 镜像管理工具 -- Harbor 开发 Tips(15) Docker 如何拉取镜像 开发 Tips(14) 使用 Helm 安装 harbor 开发 Tips(13) 使用 S2I 构建云原生应用 在 Kubernetes 中使用 emptyDir、hostPath、localVolume 开发 Tips(12) 开发 Tips(11) 代码质量分析工具 SonarQube 使用 Kubeadm 安装 Kubernetes 集群 一起来学 Go --(4)常用函数 Kubernetes 中的 Ceph Kubernetes 之 Volumes Kubernetes 之 Labels、Selectors 开发 Tips(10) 开源正在重构商业模式 Kubernetes 之网络 Kubernetes 之 API 使用 Helm 和 Operator 快速部署 Prometheus Kubernetes 复杂有状态应用管理框架 -- Operator Kubernetes 的包管理器 -- Helm 一起来学 Go --(3)Go Modules 如何一步一步地优化博客方案 kubectl 实用指南 Kubernetes 中的基本概念 搭建远程 Kubernetes 开发环境 大公司和小公司的 ToB 思路 开发 Tips(9) Go 入门指南 一起来学 Go --(2)数据与逻辑结构 如何预防 Web 富文本中的 XSS 攻击 django-xss-cleaner 云工作时代 一起来学 Go --(1)背景与特点 SaaS 开发团队的不同阶段 你不知道的 Git 使用技巧 输出既服务 微服务设计 继续奔跑 开发 Tips(8) 从账户安全到二次验证 Django 性能之数据库查询优化 Django 性能之分库分表 敏捷开发之研发流程 打造一致性的团队 开发 Tips(7) Pytest 进阶学习之 Mock PaaS 部署之 buildpack Go 开发配置 领域输出才是 PaaS 的核心竞争力 Pytest 入门学习 开发 Tips(6) 如何使用 Jenkins、Docker、GitLab 搭建 Django 自动化部署流程
Go 语言入门
微信公众号 · 2018-01-07 · via 陈少文的网站

Please enable Javascript to view the contents

1. 背景

最近十多年来,C/C++ 在计算领域没有很好得到发展,没有跟上计算机发展的脚步。

现有的编程语言,开发程度和系统效率在很多情况下不能兼得。要么执行效率高,但低效的开发和编译;要么执行效率低,但拥有高效的编译;所以需要一种拥有较高效的执行速度、编译速度和开发速度的编程语言,Go 语言就横空出世了。

Go 语言的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合起来。

另外一个目标是对于网络通信、并发和并行编程的支持,从而更好地利用大量的分布式和多核的计算机。

2. Go 语言简介

Go 语言是一个 Google 公司推出的一个开源项目,是一个系统开发语言。

Go 语言最初的设计由 Robert Griesemer,Rob Pike 和 Ken Thompson 在2007年9月开始的,官方的发布是在 2009 年 11 月。2010 年 5 月由 Rob Pike 公开的将其运用于 Google 内部的一个后台系统。

Go 可以运行在 Linux、Mac OS X、FreeBSD、OpenBSD、Plan 9 和 Windows 系统上,同时也支持多种处理器架构:I386、AMD64 和 ARM。

由于Go 语言针对多 CPU 系统进行了优化,使用 GO 编写的程序执行效率可以与 C 媲美,同时更加安全,支持并行。

3. 优势

  • 部署简单
    Go 编译生成的是一个静态可执行文件,除了 glibc 外没有其他外部依赖
  • 并发行好
    Goroutine 和 Channel 使得编写高并发的服务端软件十分容易。很多情况下,完全不需要考虑锁机制。Go 语言的并发不是以库的形式提供,而是语言层面加入了对并发的支持。
  • 程序员友好
    与 C/C++ 相比,Go 不支持一些高级语法,代码更简明,同时拥有一些动态语言的特性
  • 执行性能好
    执行效率高,虽不如 C/C++, 但比 Python 高很多,同时内存使用也很高效。

4. Go 语言基本概念与语法

  • 文件名
    Go 的源文件以 .go 为后缀名存储在计算机中,这些文件名均由小写字母组成,如 scanner.go 。如果文件名由多个部分组成,则使用下划线 _ 对它们进行分隔,如 scanner_test.go

  • 包是结构化代码的一种方式:每个程序都由包(通常简称为 pkg)的概念组成,可以使用自身的包或者从其它包中导入内容。在源文件的第一行指明该文件属于哪一个包,如:package main,表示一个可独立执行的程序。
  • 常量
    常量使用关键字 const 定义,用于存储不会改变的数据。常量的定义格式:const identifier [type] = value。
  • 变量
    声明变量的一般形式是使用 var 关键字:var identifier type。
  • 数据类型
    18个基本类型,bool、string、rune、byte、int、uint、int8、uint8、int16、uint16、int32、uint32、int64、uint64、float32、float64、complex64、complex128,7个复合类型:array、struct、function、interface、slice、map、channel
  • 控制结构
    Go 提供 if-else 结构、switch 结构、select 结构、for (range) 结构
  • 函数定义

5. 内置标准库

  • fmt
    fmt 包实现了格式化的 I/O 函数,类似C语言中的 printf 和 scanf,但是更加简单。
  • strings
    strings 包实现了用于操作字符串的简单函数,包括 strings 导出函数和 Reader, Replacer 两个结构体。
  • time
    time 包提供显示和计算时间用的函数。
  • os
    os 包提供了不依赖平台的操作系统函数接口。错误处理设计为Go 风格,失败的调用会返回错误值而非错误码。通常错误值里包含更多信息。
  • path
    path 实现了对斜杠分隔的路径进行操作的函数。
  • io
    io 包提供了对 I/O 原语的基本接口,这些接口抽象出了泛用的函数并附加了一些操作。因为这些接口是对底层实现完全不同的低水平操作的包装,除非得到其它方面的通知,客户端不应假设它们是并发安全的。
  • log
    log 包实现了简单的日志服务,log 包定义了 Logger 类型,该类型提供了一些格式化输出的方法。也提供了一个预定义的标准 Logger,可以通过辅助函数 Print[f|ln]、Fatal[f|ln] 和Panic[f|ln] 访问,比手工创建一个 Logger 对象更容易使用。Logger 会打印每条日志信息的日期、时间,默认输出到标准错误。Fatal 系列函数会在写入日志信息后调用os.Exit(1)。Panic 系列函数会在写入日志信息后调用 panic。

6. Hello World

6.1 环境配置

IDE推荐: JetBrains Gogland ,也可以任意编辑器配合 Go 插件,如:Atom + go-plus

以 CentOS 下安装为例:

查看 Go 环境配置

GOARCH="amd64"
GOOS="linux"
GOROOT="/usr/lib/golang"
GOTOOLDIR="/usr/lib/golang/pkg/tool/linux_amd64"
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-    map=/tmp/go-build157488013=/tmp/go-build -gno-record-gcc-switches"
CGO_LDFLAGS="-g -O2"

6.2 Hello

hello.go 文件

1
2
3
4
5
6
7
package main

import "fmt"

func main() {
    fmt.Printf("Hello, world.\n")
}

运行代码

1
2
$go run hello.go
Hello, world.

7. 参考


微信公众号