【Go基础】快速入门

Go基础入门

用20%的时间学习常用80%的语法

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

编译运行与打包

go 复制代码
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
go 复制代码
fmt.Println("Hello, World!")
  • 注释
go 复制代码
// 这是单行注释

/*
这是多行注释
*/
  • 变量 大小写区分,由字母数字下划线组成,作用域:包级别/函数级别,变量声明后未使用会报错
  • 常量使用 const
go 复制代码
// 三种变量的声明与初始化
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
  • 字符串

go 复制代码
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字符串
  • 数组
go 复制代码
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
  • 分片(不同于数组,大小可调整)
go 复制代码
//忽悠定义大小
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
go 复制代码
// 声明map,下面两行等价
myMap := make(map[string]int);myMap["a"]=1;// 声明,添加
myMap := map[string]int{"a":1}//声明初始化
myMap["a"]//访问
delete(myMap,"a")//删除
  • 循环
go 复制代码
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)
}
  • 条件
go 复制代码
// 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")
}
  • 操作符
go 复制代码
//比较操作符
== != > < >= <=
//算术运算符
+ - * / %
// 逻辑运算符
&& || !
// 字符串拼接
+
//自增自减
++ --
  • 结构体(变量集合)
go 复制代码
//定义结构体
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
}
  • 函数(将代码组成块,并起了名字)
go 复制代码
//声明函数(无返回值),调用
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)
  • 方法(绑定到结构体的函数)
go 复制代码
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)
}
  • 指针
go 复制代码
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
  • 接口(声明一个或多个方法签名)
go 复制代码
//声明接口
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) 
相关推荐
追逐时光者1 小时前
精选 4 款基于 .NET 开源、功能强大的 Windows 系统优化工具
后端·.net
TF男孩1 小时前
ARQ:一款低成本的消息队列,实现每秒万级吞吐
后端·python·消息队列
AAA修煤气灶刘哥2 小时前
别让Redis「歪脖子」!一次搞定数据倾斜与请求倾斜的捉妖记
redis·分布式·后端
AAA修煤气灶刘哥3 小时前
后端人速藏!数据库PD建模避坑指南
数据库·后端·mysql
你的人类朋友3 小时前
什么是API签名?
前端·后端·安全
昵称为空C5 小时前
SpringBoot3 http接口调用新方式RestClient + @HttpExchange像使用Feign一样调用
spring boot·后端
架构师沉默5 小时前
设计多租户 SaaS 系统,如何做到数据隔离 & 资源配额?
java·后端·架构
RoyLin6 小时前
TypeScript设计模式:适配器模式
前端·后端·node.js
该用户已不存在6 小时前
Mojo vs Python vs Rust: 2025年搞AI,该学哪个?
后端·python·rust
Moonbit6 小时前
MoonBit 正式加入 WebAssembly Component Model 官方文档 !
前端·后端·编程语言