赞
踩
参考文档:
《The Way to Go》
《Go 入门指南》
①安全机制: Go 语言是一门类型安全和内存安全的编程语言。虽然 Go 语言中仍有指针的存在,但并不允许进行指针运算。
②平台支持: Go 语言对于网络通信、并发和并行编程有极佳支持,从而更好地利用大量的分布式和多核的计算机
③构建速度: 它的构建速度快(编译和链接到机器代码的速度),极大地提升了开发者的生产力,同时也使得软件开发过程中的代码测试环节更加紧凑
④依赖管理: C 语言中“头文件”, Go 语言采用包模型,通过严格的依赖关系检查机制来加快程序构建的速度,提供了非常好的可量测性。
⑤执行速度: Go 语言在执行速度方面也可以与 C/C++ 相提并论。
⑥实现多态: Go 语言没有类和继承的概念,通过接口(interface)的概念来实现多态性。
⑦静态类型: 不允许隐式类型转换
⑧动态语言特性和UTF-8编码
⑨垃圾回收和自动内存分配: 因为垃圾回收和自动内存分配的原因,Go 语言不适合用来开发对实时性要求很高的软件。
⑩特性缺失: 面向对象语言中使用的特性 Go 语言都没有支持
小结:
1、两个编译器:gc和gccgo
2、平台支持:支持类 Unix (linux和Mac OS)系统和Windows系统
3、处理器架构支持:Intel和ARM(支持安卓系统)
4、程序构建:go build
和go install
go build
编译自身包和依赖包go install
编译并安装自身包和依赖包5、安装与运行环境https://learnku.com/docs/the-way-to-go/install-go-on-linux/3566
6、样例代码:
package main
func main() {
println("Hello", "world")
}
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Printf("%s", runtime.Version())
}
7、Go的源代码分支:
- Go release:最新稳定版,实际开发最佳选择
- Go weekly:包含最近更新的版本,一般每周更新一次
- Go tip:永远保持最新的版本,相当于内测版
1、编辑器:Emacs、Vim、Xcode 6、KD Kate、TextWrangler、BBEdit、McEdit、TextMate、TextPad、JEdit、SciTE、Nano、Notepad++、Geany、SlickEdit、Visual Studio Code、IntelliJ IDEA 和 Sublime Text 2
2、调试器:gdb
3、构建并运行 Go 程序
go build
编译自身包和依赖包go install
编译并安装自身包和依赖包4、格式化代码go fmt(gofmt)
gofmt -w *.go
或gofmt 文件目录
gofmt -w *.go
会格式化并重写所有 Go 源文件;
gofmt map1
会格式化并重写 map1 目录及其子目录下的所有 Go 源文件
gofmt -r <原内容> -> <替换内容> -w *.go
gofmt -r '(a) -> a' –w *.go
上面的代码会将源文件中没有意义的括号去掉。
gofmt -r 'a[n:len(a)] -> a[n:]' –w *.go
上面的代码会将源文件中多余的
len(a)
去掉。
gofmt –r 'A.Func1(a,b) -> A.Func2(b,a)' –w *.go
上面的代码会将源文件中符合条件的函数的参数调换位置。
5、生成代码文档go doc
go doc package
获取包的文档注释go doc package/subpackage
获取子包的文档注释go doc package function
获取某个函数在某个包中的文档注释godoc -http=:6060
;浏览器http://localhost:6060
6、其他工具
go install
是安装 Go 包的工具。主要用于安装非标准库的包文件,将源代码编译成对象文件。go fix
用于将你的 Go 代码从旧的发行版迁移到最新的发行版,工具会给出文件名和代码行数的提示以便让开发人员快速定位并升级代码go test
是一个轻量级的单元测试框架7、性能
8、与其它语言进行交互cgo工具
cgo
SWIG
break | default | func | interface | select |
case | defer | go | map | struct |
chan | else | goto | package | switch |
const | fallthrough | if | range | type |
continue | for | import | return | var |
append | bool | byte | cap | close | complex | complex64 | complex128 | uint16 |
copy | false | float32 | float64 | imag | int | int8 | int16 | uint32 |
int32 | int64 | iota | len | make | new | nil | panic | uint64 |
println | real | recover | string | true | uint | uint8 | uintptr |
()
,中括号 []
和大括号 {}
.
、,
、;
、:
和 …
。;
package main //包
import "fmt" //导入
func main() { //函数
fmt.Println("hello, world")
}
import "fmt"
告诉 Go 编译器这个程序需要使用 fmt
包(的函数,或其他元素)【类似python的包或C语言的头文件】//法1:
import "fmt"
import "os"
//法2:
import "fmt"; import "os"
//法3:
import (
"fmt"
"os"
)
//法4:
import ("fmt"; "os")
指定导入包的位置:以 .
或 /
开头,
./
开头,则 Go 会在相对目录中查找;/
开头,则会在系统的绝对路径中查找。可见性规则 :类似public
和private
func functionName()
{
必须与方法的声明放在同一行,右大括号 }
需要被放在紧接着函数体的下一行。如果函数非常简短,也可以将它们放在同一行:
func Sum(a, b int) int { return a + b } //没有返回的变量名?
func functionName(parameter_list) (return_value_list) {
…
}
//示例:
func FunctionName (a typea, b typeb) (t1 type1, t2 type2){
}
其中:(变量名 类型)
- parameter_list 的形式为
(param1 type1, param2 type2, …)
- return_value_list 的形式为
(ret1 type1, ret2 type2, …)
fmt.Println("hello, world")
和fmt.Print("hello, world\n")
print
、println:print("ABC")
、println("ABC")
、println(i)
(带一个变量 i)。【这些函数只可以用于调试阶段,在部署程序的时候务必将它们替换成 fmt
中的相关函数。】//
/*块注释*/
int、float、bool、string
struct、array、slice、map、channel
interface
nil
type IZ int
package main import ( "fmt" ) const c = "C" var v int = 5 type T struct{} func init() { // initialization of package } func main() { var a int Func1() // ... fmt.Println(a) } func (t T) Method1() { //参数不应该是在函数名后面吗?func Method1 (t T)() //... } func Func1() { // exported function Func1 //... }
valueOfTypeB = typeB(valueOfTypeA)
即:类型 B 的值 = 类型 B(类型 A 的值)
const identifier [type] = value
(类型可省了)const Ln2 = 0.693147180559945309417232121458\
176568075500134360255254120680009
const Log2E = 1/Ln2 // this is a precise reciprocal
const Billion = 1e9 // float constant
const hardEight = (1 << 100) >> 97
\
: 可以在常量表达式中作为多行的连接符使用。const beef, two, c = "eat", 2, "veg"
const ( //这些枚举值可以用于测试某个变量或常量的实际值,比如使用 switch/case 结构
Unknown = 0
Female = 1
Male = 2
)
iota
可以被用作枚举值:(iota
的详细用法请查看《Go编程基础》 第四课:常量与运算符const (
a = iota //a=iota=0
b //b=1
c //c=2
)
- C 语言中,
int* a, b
的声明表示a 是指针而 b 不是【学了这么久的C语言才知道原来*是跟着变量名的!!!】- Go 中可以很轻松地将它们都声明为指针类型:
var a, b *int
var i = 5
,Go 编译器可以根据变量的值来自动推断其类型var (
HOME = os.Getenv("HOME")
USER = os.Getenv("USER")
GOROOT = os.Getenv("GOROOT")
)
:=
,用于在函数体内声明局部变量,如:a := 1
int、float、bool 和 string、数组、结构 等
&i
slices、maps、channel
func Printf(format string, list of variables to be printed)
fmt.Print("Hello:", 23)
fmt.Sprint("Hello:", 23)
:=
可以高效地创建一个新的变量,称之为初始化声明a := 50
或 b := false
//类型由编译器自动推断a := 20
不允许 ,而 a = 20
是可以的a, b = b, a
_
被用于抛弃值(与python相同)==
或者不等 !=
!
、和 &&
、或 ||
【同C语言】%t
is
或者 Is
开头int
、uint
和 uintptr
。有符号:int8、int16、int32、int64;无符号:uint8、uint16、uint32、uint64
float32、float64
;用于格式化整数(
%x和
%X用于格式化 16 进制表示的数字),
%g用于格式化浮点型(
%f输出浮点数,
%e输出科学计数表示法),
%0nd` 用于规定输出长度为n的整数,其中开头的数字 0 是必须的。%n.mg
用于表示数字 n 并精确到小数点后 m 位,除了使用 g 之外,还可以使用 e 或者 f,例如:使用格式化字符串 %5.2e
来输出 3.4 的结果为 3.40e+00
。re+imI
,如:var c1 complex64 = 5 + 10i
%v
、输出一部分: %f
c = complex(re, im)
==
或者不等号 !=
&
、按位或 |
、按位异或 ^
、位清除 &^
^
、位左移 <<
、位右移 >>
位清除
&^
:将指定位置上的值设置为 0。
按位补足^
:该运算符与异或运算符一同使用,即m^x
,对于无符号 x 使用“全部位设置为 1”,对于有符号 x 时使用m=-1
。例如:^10 = -01 ^ 10 = -11
==
、!=
、<
、<=
、>
、>=
+
、-
、*
、 /
、%
-=
、*=
、/=
、%=
,如:语句 b = b + a
简写为 b+=a
++
和 --
的只能作为语句,而不能用于表达式【与C语言不同!!!】rand.Float32
和 rand.Float64
返回介于 [0.0, 1.0) 之间的伪随机数,其中包括 0.0 但不包括 1.0。函数 rand.Intn
返回介于 [0, n) 之间的伪随机数。Seed(value)
函数来提供伪随机数的生成种子,一般情况下都会使用当前时间的纳秒级数字package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
a := rand.Int() //没哟限制输出范围
b := rand.Intn(8) //相当于%8,输出范围为0~7
timens := int64(time.Now().Nanosecond())
rand.Seed(timens)
fmt.Printf("%2.2f / ", 100*rand.Float32()) //输出[0,100)的随机浮点数,整数部分2位,小数部分2位
}
优先级 运算符
7 ^ !
6 * / % << >> & &^
5 + - | ^
4 == != < <= >= >
3 <-
2 &&
1 ||
type TZ int
byte
类型是 uint8
的别名rune
类型是 int32
的别名//ASCII码:byte类型
var ch byte = 65 //法1:10进制法
var ch byte = '\x41' //法2:16进制法(\x后2位16进制数)
var ch byte = '\101' //法3:8进制法(\后3位8进制数)
//Unicode码:int16或int类型,至少占用2个字节
var ch int = '\u0041' //法4:\u后4位16进制
var ch3 int = '\U00101234' //法5:\U后8位16进制
%c
、字符的整数%v
或 %d
、U+hhhh 的字符串%U
\n
、\r
、\t
、\u
或 \U
、\\
(与双引号一起使用)`This is a raw string \n` 中的 `\n\` 会被原样输出。
\0
。string
类型的零值为长度为零的字符串,即空字符串 ""
。str[i]
,str为字符串名+
,简写形式 +=
,其他拼接方法:函数strings.Join()
或字节缓冲bytes.Buffer
HasPrefix
判断字符串 s
是否以 prefix
开头:
strings.HasPrefix(s, prefix string) bool
HasSuffix
判断字符串 s
是否以 suffix
结尾:
strings.HasSuffix(s, suffix string) bool
Contains
判断字符串 s
是否包含 substr
:
strings.Contains(s, substr string) bool
//ASCII码
strings.Index(s, str string) int //返回第一个索引
strings.LastIndex(s, str string) int //返回最后一个索引
//非ASCII码
strings.IndexRune(s string, r rune) int
//第二个参数也可以是int类型
strings.Replace(str, old, new, n) string
str
中的前 n
个字符串 old
替换为字符串 new
old
为new
Count
用于计算字符串 str
在字符串 s
中出现的非重叠次数:
strings.Count(s, str string) int
strings.Repeat(s, count int) string
//例:
newS = strings.Repeat("a", 3) //newS="aaa"
strings.ToLower(s) string //变小写
strings.ToUpper(s) string //变大写
strings.TrimSpace(s)
strings.Trim(s, "cut")
TrimLeft
TrimRight
strings.Fields(s)
sep
分割:strings.Split(s, sep)
sep
来拼接:strings.Join(sl []string, sep string) string
strings.NewReader(str)
Read()
ReadByte()
和 ReadRune()
strconv.Itoa(i int) string
、②strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int) string
strconv.Atoi(s string) (i int, err error)
②strconv.ParseFloat(s string, bitSize int) (f float64, err error)
time
包time.Time
time.Now()
、 t.Day()
、t.Minute()
、t.Month()
、 t.Year()
t = time.Now().UTC()
t.Format(time.RFC822)
和t.Format(time.ANSIC)
fmt.Printf("%02d.%02d.%4d\n", t.Day(), t.Month(), t.Year())
fmt.Println(t.Format("02 Jan 2006 15:04"))
,输出:21 Jul 2011 10:31
time.After
、 time.Ticker
、time.Sleep
&
(返回相应变量的内存地址)var i1 = 5
var intP *int
intP = &i1
*intP
(初始值为nil
)c = *p++
是不合法的)var p *int = nil
是不合法的)if condition1 {
// do something
} else if condition2 {
// do something else
} else {
// catch-all or default
}
{
必须和关键字在同一行}
必须和 else-if 关键字在同一行if val := 10; val > max { //简短方式 `:=` 声明的变量的作用域只存在于 if 结构中
// do something
}
if runtime.GOOS == "windows"
os.Exit(1)
case val1, val2, val3
。break
语句来表示结束。【与C语言不同】fallthrough
关键字来达到目的。return
语句来提前结束代码块的执行default
分支(可选项):一般放在最后(相当于else)switch var1 { //花括号 `{` 必须和 switch 关键字在同一行
case val1:fallthrough
...
case val2:
...
default:
...
}
switch a, b := x[i], y[j] {
case a < b: t = -1
case a == b: t = 0
case a > b: t = 1
}
for(;;)
相似,可以在循环中同时使用多个计数器for i := 0; i < 5; i++ {
fmt.Printf("This is the %d iteration\n", i)
}
//使用多个计数器
for i, j := 0, N; i < j; i, j = i+1, j-1 {}
for i:=0; i<5; i++ {
for j:=0; j<10; j++ {
println(j)
}
}
for 条件语句 {}
var i int = 5
for i >= 0 {
i = i - 1
fmt.Printf("The variable i is now: %d\n", i)
while(TRUE)
for { }
:相当于 for true { }
return
或break
for i in array:
for ix, val := range coll { }
for pos, char := range str {
fmt.Printf("Character on position %d is: %c \n", pos, char)
}
func main() {
LABEL1:
for i := 0; i <= 5; i++ {
for j := 0; j <= 5; j++ {
if j == 4 {
continue LABEL1
}
fmt.Printf("i is: %d, and j is: %d\n", i, j)
}
}
}
func main() {
i:=0
HERE:
print(i)
i++
if i==5 {
return
}
goto HERE
}
return
语句可以带有零个或多个参数func g() {
}
pack1.Function(arg1, arg2, …, argn)
func flushICache(begin, end uintptr)
type binOp func(int, int) int
&variable
()
把它们括起来,比如 (int, int)
【return 需要指明返回的变量或可计算的值】//非命名返回值
func getX2AndX3(input int) (int, int) {
return 2 * input, 3 * input
}
//命名返回值
func getX2AndX3_2(input int) (x2 int, x3 int) {
x2 = 2 * input
x3 = 3 * input
// return x2, x3
return //return无需参数
//return 或 return var 都是可以的。
}
// this function changes reply:
func Multiply(a, b int, reply *int) {
*reply = a * b
}
...type
(type为参数的类型) 的形式,参数长度>=0func myFunc(a, b, arg ...int) {}
slice...
的形式来传递参数,调用变参函数func main() { x := min(1, 3, 2, 0) fmt.Printf("The minimum is: %d\n", x) slice := []int{7,9,3,5,1} x = min(slice...) //采用slice...传递参数 fmt.Printf("The minimum in the slice is: %d", x) } func min(s ...int) int { if len(s)==0 { return 0 } min := s[0] for _, v := range s { //_是索引信息 if v < min { min = v } } return min }
type name struct
】//相当于把interface{}作为类型名
func typecheck(..,..,values … interface{}) {
for _, value := range values { //_是索引信息,不需要使用,故使用空白符
switch v := value.(type) {
case int: …
case float: …
case string: …
case bool: …
default: …
}
}
}
func f() {
for i := 0; i < 5; i++ {
defer fmt.Printf("%d ", i)
}
}
//输出:4 3 2 1 0
defer file.Close()
defer mu.Unlock()
defer printFooter()
// open a database connection
func() { //没有函数名,定义函数体
sum := 0
for i := 1; i <= 1e6; i++ {
sum += i
}
}() //此括号表示调用该匿名函数
fplus := func(x, y int) int { return x + y } //定义匿名函数,并赋值给变量fplus
fplus(3,4) //通过变量名fplus调用匿名函数
runtime
中的函数 Caller()
log
包中的特殊函数start := time.Now() //起始时间
longCalculation()
end := time.Now() //结束时间
delta := end.Sub(start) //作差
fmt.Printf("longCalculation took this amount of time: %s\n", delta)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。