- 一、go语言的特点
-
1、采用import导包,语法简单,可快速入门 -
2、语句末尾不用加分号,不过有些情况需要加 ",",比如给map初始化的时候 -
3、if和for,switch循环不用打括号 -
4、静态编译,编译好之后,不需要再配置运行环境,很方便 -
5、跨平台,可以在Linux、windows等多种平台使用 -
6、高性能,高并发,这是其他语言所不能比的,也是golang最鲜明的地方 -
7、特殊的垃圾回收机制 -
8、工具链,官方库完善,仅仅使用官方库,就能实现高性能的程序,十分方便
- 二、工具选择
-
vscode或者goland,厉害的也可以用vim - 三、基础语法
- . - 输出 hello,world package main
import"fmt"
func main() {
fmt.Println("hello,world!")
}
- 变量与打印输出
-
赋值:类型推导 a :="hello,world" ;会自动推导a的类型 -
var b,c string="hello,world" ;可多个变量一起赋值,变量类型要写在变量后面 -
var d='c' ;也可省略变量类型 -
print("%v"),格式化输出 -
%v、%t、%T、%+v、%#v,%s,%c、%d等..... -
prinfln("hello",a,"world",b) 打印,并且换行
package main
import (
"fmt"
"unsafe"
)
func main() {
var name string = "汉克"
var str string = "a"
var b1 byte = 'b'
var num1 int32 = '中'
var num2 int32 = 11
str = fmt.Sprintf("%d", num2)
fmt.Printf("a的值 %T\n,大小为 %d \n", str, unsafe.Sizeof(str))
fmt.Println("b1的值", b1)
fmt.Printf("b1=%v b1=%c ", b1, b1)
fmt.Println(name)
fmt.Printf("num1 = %c\n", num1)
fmt.Printf("num1 = %d", num1)
fmt.Println(num1)
fmt.Println(str)
}
3.if,else
-
如上边所说,if后面不用加括号,"{" 必须与if写在同一行,else也要与 "}" 写在同一行 4.for循环
-
语法规则与if一样,可通过continue继续循环,也可break跳出循环,for后面不跟条件,就是死循环
- switch,cash
- 后边也不需要加括号,与c不同的是,执行完之后,就跳出switch了,不需要break,switch后可不跟变量,直接在cash后加条件,使用更加灵活
- slice切片
- 与数组不同的是,它没有长度,所以使用更加灵活
- 声明: var a[]int 这就是一个切片的声明,没有长度,也没有空间,需要使用make来开辟空间 make([]int,3) ;
- 使用append给slice切片追加元素,如:append(1,2),就是向其中追加1和2两个元素,如果元素超出了slice的容量,会以目前容量的两倍来开辟空间
- len和cap来求出长度与容量
- 截取,如:b :=a[0,2] ;就是截取下标0,1的元素
- copy复制,如cpoy(b,a),把a的值拷贝到b中,这时也可使用截取操作
- map
var m map[string]int可声明一个map,也需要make来开辟空间,如:make(map[string]int)- 赋值:
m["name"]=1 - map为键值对形式,如 "name":1
- 删除元素,
delete(m,"name") - 可以有两个返回值,如,
value,ok :=m["age"],如果没有值,就会返回错误 - 通过range来遍历,如:
value,index := range m
8、函数
- 不用指针就是值拷贝
- 可返回多个值,如:
func sumTest(a int,b int)(sum int,ok string){retun a+b,ok}
- 结构体
type sumTest strut{ name string age int }- 结构体函数:
func (s sumTest)agePt(){fmt.println(s.age)}
- 错误处理
- 使用nil来及时传回错误信息,通过哟
errors.New("err fail")创建错误信息
11.字符操作 print 12.json操作
package main
import (
"encoding/json"
"fmt"
"reflect"
)
type movie struct {
Name string `json:"名字"`
Year int `til:"year"`
Actro []string `json:"actor"`
}
func main() {
m1 := movie{"xingjizhanz", 1999, []string{"dada", "dd"}}
str, err := json.Marshal(m1)
if err != nil {
fmt.Println("ERR,RETURN", err)
return
}
fmt.Printf("%s\n", str)
m2 := reflect.ValueOf(m1)
fmt.Println(m2)
//解码
m3 := movie{}
err = json.Unmarshal(str, &m3)
fmt.Printf("%v", m3)
fmt.Println(err)
}
13.时间相关
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now() //当前时间
t := time.Date(2023, 5, 12, 11, 04, 44, 0, time.UTC) //转换为时间
t2 := time.Date(2022, 5, 12, 11, 04, 44, 0, time.UTC)
sub := t2.Sub(t) //两个时间相减
t3, err := time.Parse("2024-05-12 11:04:44", "2023-05-12 11:04:44") // parse 格式化时间
t4 := t.Format("2022-05-12 11:04:44")
fmt.Println(now)
fmt.Println(t, "\n", t2, "\n", sub)
fmt.Println(t4)
fmt.Println(t3, "\n", err)
fmt.Println(now.Unix()) //获取时间戳
}
14.数字转换
- 包::strconv
- ParseFloat(,);第一个参数是数字,第二个是精度
- ParseInt(,,);第一个参数是数字,第二个是进制,第三个是精度
- Atoi(),转换为数字,或者字符串
15.进程相关
- 包:os、 os/exec
- os.args //返回进程执行相关信息
- os.Getenv("PATH") //返回环境变量
- os.Setenv("A","B") //设置环境变量
- exec.Command //获取子进程和其输入输出