开发环境
IDE选择
goland
由jet brains所推出的一款ide,可以说这家公司的ide系列都是非常好用的
vscode
vscode是由微软推出的ide,但是需要装许多的插件才能使用,前期的配置起来还是比较繁琐,优点就是可以在一个vscode上编辑不同的语言
Golang安装
https://golang.google.cn/dl/ 官网下载根据系统下载安装包
设置环境变量
添加对应的环境变量,在powershell的终端中以此输入下列环境,最后用 go env
查看修改情况
setx GOBIN "%GOPATH%bin"
setx PATH "%PATH%;%GOBIN%"
setx GO111MODULE "on"
setx GOPROXY https://mirrors.aliyun.com/goproxy/
第一个程序
hello world
该程序一定要严格按照下面的来写
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
Go语法
数据类型
基本数据类型
bool、string、int、int8、int16、int32、int64、uint、uint8、uint16、uint32、uint64、uintptr、byte、rune、float32、float64、complex64(复数)、complex128
var x = "test" //关键字var定义变量x,数据类型由系统判断
z := int(233) //定义变量z,赋值为int型的233
切片和映射
列表和字典
var s = make([]string, 0)
s = append(s, "something")
var m = make(map[string]string)
m["key"] = "value"
指针
&获取变量内存地址,*获取地址中值
var num = int(123)
ptr := &num
fmt.Println(*ptr)
*ptr = 100
fmt.Println(num)
结构体
创建基础模版
※在go中以大小写字母来确定作用域,大写开头为包外可用,小写开头则为私有
type Person struct {
Name string
Age int
}
func (p *Person) SayHello() {
fmt.Println("Hello,", p.Name)
}
func main() {
var guy = new (Person)
guy.Name = "Dave"
guy.SayHello()
}
接口
方便调用函数
func(p *Person) SayHello() {
fmt.Println("Hello,", p.Name)
}
type Friend interface {
SayHello()
}
func Greet(f Friend) {
f.SayHello()
}
type Dog struct { }
func (d *Dog) SayHello() {
fmt.Println("Woof")
}
func main() {
var guy = new(Person)
guy.Name = "Dave"
Greet(guy)
var dog = new(Dog)
Greet(dog)
}
控制结构
if/else
用于条件判断
if x == 1 {
fmt.Println("x = 1")
} else {
fmt.Println("x ≠ 1")
}
switch
条件判断
switch x {
case "aaa":
fmt.Println("Found aaa")
case "bbb":
fmt.Println("Found bbb")
default:
fmt.Println("Default case")
}
通过switch判断数据类型
func test(i interface{}) { //定义参数类型
switch i.(type) { //参数类型
case int:
fmt.Println("Integer")
case string:
fmt.Println("String")
default:
fmt.Println("Unknown type")
}
}
func main() {
test("aaa")
}
for
for i := 0; i < 10; i++ {
fmt.Println(i)
}
遍历数组
num := []int{2,4,6,8}
for idx, val := range num {
fmt.Println(idx, val)
}
并发
goroutine
go中有一种channel的数据类型,该类型提供了一种机制,goroutine可以同步执行函数并且这些函数可以相互通信
package main
import (
"fmt"
"time"
)
func f() {
fmt.Println("f function")
}
func main() {
go f()
time.Sleep(1 * time.Second)
fmt.Println("main function")
}
//程序同时运行函数f和main
通道
使用通道同时显示不同字符串长度和总和
package main
import "fmt"
func strlen(s string, c chan int) {
c <- len(s) //将结果放入通道c
}
func main() {
c := make(chan int) //make创建通道
go strlen("Salutations", c)
go strlen("World", c)
x, y := <-c, <-c
fmt.Println(x, y ,x+y)
}
-
chan int
int类型的通道 -
<-
运算符指示数据流入还是流出通道
错误处理
在go中并没有try、catch、finally这样的处理语法
在错误处理常见的代码如下
import "errors"
func x() error {
return errors.New("Some Error Occurred")
}
func main() {
if err := x(); err != nil {
//处理错误
}
}
处理结构化数据
Json
import (
"encoding/json"
"fmt"
)
type x struct {
Name string
Word string
}
func main() {
f := x{"Catalyze", "Hello World"}
b, _ := json.Marshal(f) //_用于接收其他不需要的值
fmt.Println(string(b))
json.Unmarshal(b, &f)
}
Marshal()
该方法将struct编码为json
Unmarshal()
该方法将json解码为struct格式
XML
import (
"encoding/xml"
"fmt"
)
type x struct {
Name string `xml:"name,attr"`
Word string `xml:"parent>child"`
}
func main() {
f := x{"Catalyze", "Hello World"}
b, _ := xml.Marshal(f)
fmt.Println(string(b))
xml.Unmarshal(b, &f)
}
原文始发于微信公众号(CatalyzeSec):Golang基础
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论