Go基础入门

官方网址(下载安装/官方文档/官方类库)

  • Download Go binaries from https://go.dev/dl/
  • Reference the official Go documentation https://go.dev/doc/
  • See all the the Go packages https://pkg.go.dev/
  • Access the Go Playground https://go.dev/play/

编译运行与打包

package main
import "fmt"
func main() {
    fmt.Println("Hello, World!")
}
  • go run hello.go

  • <GOOS=[darwin|linux|windows] GOARCH=[386|amd64|arm]> go build hello.go

  • GOPATH, the path to store models/libraries,default:$HOME/go

语言特性

  • 空白格没有特殊意义,不像python,用缩进表示代码块
  • 分号可以省略,像javascript
fmt.Println("Hello, World!")
  • 注释
// 这是单行注释

/*
这是多行注释
*/
  • 变量 大小写区分,由字母数字下划线组成,作用域:包级别/函数级别,变量声明后未使用会报错
  • 常量使用 const
// 三种变量的声明与初始化
var a = 10; //自动检测类型
var b int; b = 11;// 手动声明类型
c:=10 // 简化声明
// 多变量声明
var a,b=10,"Jim"; 
a,b:=10,"Jim"
  • 基本数据类型

    • 整型 int, int8, int16, int32, rune, int64, uint, uintptr, uint8, uint16, uint64
    • 浮点 float32 float64
    • 复数 complex32 complex64
    • 字节 byte,in ASCCI
    • 字符串 string,a set of byte vaules
    • 布尔 bool,true/false
  • 字符串

var str = "test"; //必须双引号
len(str) //4 求长度,使用内置len函数
str[0] //读取某个位置字符
str[:2] str[2:] str[:]//te st  test 读取部分子串
str[:2] + str[2:] //test 使用 + 拼接字符串
// 使用内置strings提供的函数库 https://pkg.go.dev/strings
strings.ToUpper() //转大写
strings.ToLower() //转小写
strings.HasPrefix(a, b) //判断a是否以b开始
strings.HasSuffix(a,b) //判断a是否以b结尾
strings.Contains(a,b) //判断a是否包含b子串
strings.Count(a,b) //计算b在a中出现多少次
strings.Join(a string[],sep) //将字符串数组a使用sep拼接起来
strings.Split(a,sep) //将字符串a按sep分隔成字符串数组
strings.ReplaceAll(a,old,new) //将a中所有old字符串替换成new字符串
  • 数组
var arr [3]string //声明字符串数组
var arr = [3]string{"a","b","c"} //声明并且赋值
var arr = [...]string{"a","b","c"} 
arr[0] arr[1] //访问
arr[2] = "e" //更新 
len(arr)// 3 求元素数
//复制
a := [...]string{"first","second","third"}
b := a;
a[2]="another"
b[2] // third,保持不变
a[2] // another
  • 分片(不同于数组,大小可调整)
//忽悠定义大小
var arr []string  // 声明不带大小
arr := []string{"first","second","third"} // 声明并赋值
arr0 := make([]string,0,10) // 通过make函数创建容量为10的空分片
arr1 := make([]string,3) // 通过make函数创建大小为3的分片
arr2 := append(arr,"forth","fifth")//通过append追加字符串,注意不能直接复制给原来分片
copy(arr1,arr)//将arr赋值给arr1
//来自同一个数组的所有分片共享一份数据,改动其中一个,其他分片受影响
myArray := [3]string{"First", "Second", "Third"} //定义数组
mySlice := myArray[:] //通过数组得到分片1,分片2
mySlice2 := myArray[:]
mySlice[0] = "test" // 改动分片1
mySlice2[0] // test 分片2受影响
  • Maps
// 声明map,下面两行等价
myMap := make(map[string]int);myMap["a"]=1;// 声明,添加
myMap := map[string]int{"a":1}//声明初始化
myMap["a"]//访问
delete(myMap,"a")//删除
  • 循环
for i:=0;i<10;i++ {
  fmt.Println(i)
}
// go 只有for,可以模拟while
i:=0
for i < 10 {
  fmt.Println(i)
  i++
}
// 省略条件的for,通过break跳出循环
for {
  fmt.Println(i)
  if(i >= 10){
    break
  }
  i++
}
// for 迭代数组使用range
numbers := []int{1,2,3,4,5}
for index,number := range numbers { //使用_替换index,如果不需要index
  fmt.Printf("%d: %d\n", index, number)
}
  • 条件
// if条件
if age < 12 {
  //child
} else if age < 18  {
  //teen
} else {
  //adult
}
// switch , 不需要break
switch age{
  case 0: fmt.Println("Zero years old")
  case 1: fmt.Println("One year old")
  case 2: fmt.Println("Two years old")
  case 3: fmt.Println("Three years old")
  default: fmt.Println(i + " years old")
}
  • 操作符
//比较操作符
== != > < >= <=
//算术运算符
+ - * / %
// 逻辑运算符
&& || !
// 字符串拼接
+
//自增自减
++ --
  • 结构体(变量集合)
//定义结构体
type Person struct{
  Name string //大写表示public access,小写表示private
  Age int
}
//实例1
jim := Person{}
jim.Age = 20;
jim.Name = "Jim"
//实例2
jim := Person{"Jim",20} 
//实例3
jim := Person{Age:20,Name:"Jim"} 
jim := Person{Name:"Jim"} 

//访问
jim.Name // Jim
jim.Age //20

// 结构体嵌套结构体
type Class struct{
  Teacher Person // 这里 嵌套Person结构体
  NumberOfStudents int
}

  • 函数(将代码组成块,并起了名字)
//声明函数(无返回值),调用
func doSomething(a int ,b int){

}
doSomething(1,2)
// 多返回值
func doSomething(a int ,b int) (int,int) {
  return b,a
}
a,b := doSomething(1,3);
// 接收可变参数
func sum(numbers ...int) int {
  total := 0
  for _,number := range numbers {
    total += number
  }
  return total
}
total := sum(1,2,3,4,5)
  • 方法(绑定到结构体的函数)
type Person struct{
  Name string
  Age int
}
func (p Person) Speak(){
  fm.Println("Hello, I'm " + p.Name + "," + p.Age)
}
func (p *Person) Speak(){
  fm.Println("Hello, I'm " + p.Name + "," + p.Age)
}
  • 指针
age := 20;
ageAddr := &age // 获取内存地址
age2 := *ageAddr // 获取地址对应值

func doSomething( i int){// 值传递
  i = 21;
}
doSomething(age) //没改变age

func doSomething(i *int){ // 指针传递
  *i = 21;
}
doSomething(age) // age 变成 21
  • 接口(声明一个或多个方法签名)
//声明接口
type Speaker interface{
  Speak()
}
// 定义接收接口的函数
func doSomething(Speaker s){
  s.Speak()
}
//定义实现Speak方法的结构体
type Person strut{
  Name string
}
func (p Person) Speak(){
   fm.Println("Hello, I'm " + p.Name)
}
//实例结构体,并传入已经定义的函数
p := Person{Name:"jim"}
doSomething(p) 
06-01 10:07