假期有时间,学两天golang,了解性能与思想。
1、首先装环境,下载golang环境包:https://golang.google.cn/dl/,下载后默认装在c:\Go。
2、(后面这步看环境,有时候能省略)然后把bin添加到path中,即可开始go!
hello.go
package main //这个包的name main
import "fmt" //导入一个包,fmt是go的常用读写包
func main(){
fmt.Println("hello world") //fmt中 Println 输出,注意结尾不带;
}
go run hello.go
这里是.go为后缀,go run xxx.go 为运行
go build hello.go 则生成一个二进制文件,./hello.exe hello.exe 都可以直接运行。
package main
import "fmt"
//标识符:大写字母开头,Abc,可以被外部包引用。abc则仅可被内部引用
//var age int //声明age为int类型,无说明则默认为0
var res int = 105
const PI = 3.14; // 常量定义。(;为啥加不加都能跑)
var name = "gopher" // 全局变量的声明和赋值
func main(){
fmt.Println(PI)
fmt.Println(name)
/*
var a,b,c int
fmt.Scan(&a, &b, &c)
fmt.Println(a+b+c)
*/
}
//变量的声明
var isActive bool // 全局变量声明
var enabled, disabled = true, false // 忽略类型的声明
func test() {
var available bool // 一般声明,bool默认为false(0)
valid := false // 简短声明
available = true // 赋值操作
}
Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。
数据类型:布尔、数字、字符串、派生【指针(Pointer)、数组、结构化类型(struct)、
Channel(管道,用于goruntine之间通信,每个 channel 都有一个特殊的类型,
也就是 channels 可发送数据的类型。一个可以发送 int 类型数据的 channel 一般写为 chan int),
切片,接口,Map类型】
nil的意思是无,或者是零值。
pointer的初始化为nil
nil 指针也称为空指针
iota只能在常量的表达式中使用
第一个 iota 等于 0,每当 iota 在新的一行被使用时,它的值都会自动加 1;所以 a=0, b=1, c=2 可以简写为如下形式:
const (
a = iota
b
c
)
循环:
for i := 1; i <= 9; i++ {
fmt.Println("it is ",i)
}
函数的使用:
package main
import "fmt"
//(x,y,string) 表示传入参数的类型
//(string,string) return 的参数
func swap(x, y string) (string, string) {
return y, x
}
func main() {
a, b := swap("Go", "Docker") //直接拿返回值,不需要定义数据类型了
fmt.Println("after swap :",a,b)
}
数组初始化:
func main() {
var balance [10] float32
var a [5][5] int
var b = [3][5]int {{1, 2, 3, 4, 5}, {0, 9, 8, 7, 6}, {3, 4, 5, 6, 7}}
var c = [3]int {1,2,3}
a[1][2] = 3
balance[0] = 0.5
fmt.Println(balance[0])
fmt.Println(a[1][2])
fmt.Println(b[1][2])
fmt.Println(c[1])
}
修改实参
swap(&a, &b);
func swap(x *int, y *int) { //x为这个值地址的指针
var temp int
temp = *x /* 保存 x 地址的值 */
*x = *y /* 将 y 赋值给 x */
*y = temp /* 将 temp 赋值给 y */
}
//交换这两个值
结构体
type Books struct {
title string
author string
subject string
book_id int
}
func main() {
var test Books
test.title="123"
test2 := Books{"go","you","abc",10} //注意:= 与 =
fmt.Println(test.title,'\n',test2)
}
切片
package main
import "fmt"
func main() {
var a [10]int //数组
a[0]=123
a_len :=len(a)
fmt.Println(a[0])
fmt.Println("len = ",a_len)
slice1 := make([]int, 6) //切片,类似动态数组,vector?
slice1[0]=555
fmt.Println("slice1 = ",slice1,len(slice1),cap(slice1))
slice2 := slice1[1:5] //类似numpy的操作
fmt.Println("slice2 = ",slice2,len(slice2))
slice2 = append(slice2,123,5,7)
fmt.Println("slice2 = ",slice2," len = ",len(slice2)," cup = ",cap(slice2))
//len与cup是不同的概念,len为现在元素的个数,cup为一个长度为k的空间,左指针left,右指针right。
//那么cup为总容量-left指针位置的长度
//那么slice长度为6,slice[:4],cup为6
//slice[2:],cup=4
//slice大部分时候性能表现不错,连续内存有利cache
sum := 0
for i,num := range slice2{
fmt.Println(i,num)
sum +=num
}
fmt.Println(sum)
}
map
func main() {
map_name := make(map[int]int)
map_name[123]=456
map_name[11]=22
fmt.Println(map_name," ==== ",map_name[11])
for i,num := range map_name{
fmt.Println(i,num)
}
}