走进go基础语法 |青训营笔记

60 阅读4分钟
  • 一、go语言的特点
  1. 1、采用import导包,语法简单,可快速入门
    
  2. 2、语句末尾不用加分号,不过有些情况需要加 ",",比如给map初始化的时候
    
  3. 3ifforswitch循环不用打括号
    
  4. 4、静态编译,编译好之后,不需要再配置运行环境,很方便
    
  5. 5、跨平台,可以在Linux、windows等多种平台使用
    
  6. 6、高性能,高并发,这是其他语言所不能比的,也是golang最鲜明的地方
    
  7. 7、特殊的垃圾回收机制
    
  8. 8、工具链,官方库完善,仅仅使用官方库,就能实现高性能的程序,十分方便
    
  • 二、工具选择
  • vscode或者goland,厉害的也可以用vim
    
  • 三、基础语法
  1. . - 输出 hello,world package main
import"fmt"
func main() {
	fmt.Println("hello,world!")
}

  1. 变量与打印输出
  • 赋值:类型推导  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后面不跟条件,就是死循环

  1. switch,cash
  • 后边也不需要加括号,与c不同的是,执行完之后,就跳出switch了,不需要break,switch后可不跟变量,直接在cash后加条件,使用更加灵活
  1. 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中,这时也可使用截取操作
  1. 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}
  1. 结构体
  • type sumTest strut{ name string age int }
  • 结构体函数:func (s sumTest)agePt(){fmt.println(s.age)}
  1. 错误处理
  • 使用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 //获取子进程和其输入输出