[Go] GO学习文档-白猫版

🌈 简介

Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。

Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。

🍎 环境搭建

官方网站
https://studygolang.com/

IDE下载
https://download.jetbrains.com.cn/go/goland-2021.1.exe

🍎 Hello World

package main

import "fmt"

func main() {
    fmt.Println("Hello world!")
}

🍎 变量

// 整型
var a int = 100
a := 100
// 浮点型
b := 1000.0
// 字符串
c := "Objcat"
// 数组
d := []int{1, 2, 3}
// 字典
e := map[string]string{"name": "objcat", "age": "18"}

🍎 函数

1.无参数无返回值

func hello() {
    fmt.Println("hello world!")
}

func main() {
    hello()
}

2.有参数无返回值

func hello(text string) {
    fmt.Println(text)
}

func main() {
    hello("hello world!")
}

3.有参数有返回值

func hello(text string) string {
    return text
}

func main() {
    result := hello("hello world!")
    fmt.Println(result)
}

🍎 字符串

1. 定义字符串

var myStr string = "123"
// 或 推导
myStr := "123"

2. 获取字符串

// 字符串可以通过下标来获取字字符串
fmt.Printf("%c", myStr[0]) // 1 
fmt.Printf("%c", myStr[1]) // 2 

3.拼接字符串

// 加号拼接
myStr2 := myStr + "456" // 123456
// 数组拼接
StrArr := []string{"123", "456"}
myStr2 := strings.Join(StrArr, "") // 123456
// format
myStr2 := fmt.Sprintf("%s%s", myStr, "456") // 123465
// Buffer
var sbuffer bytes.Buffer
sbuffer.WriteString("123")
sbuffer.WriteString("456")
myStr2 := sbuffer.String() // 123456
// builder
var sbuilder strings.Builder
sbuilder.WriteString("123")
sbuilder.WriteString("456")
myStr2 := sbuilder.String()

4.替换字符串

myStr2 := strings.ReplaceAll(myStr, "1", "12") // 1223

5.查找字符串位置

index := strings.Index(myStr, "2") // 1

6.遍历字符串

for index, value := range myStr {
    fmt.Println("索引", index)
    fmt.Println(fmt.Sprintf("值 %c 类型 %T", value, value))
}

🍎 数组

1.定义数组

// 定长数组
var myArr [10]string
myArr := [10]int{1, 2, 3}

// 动态数组
var myArr = make([]int, 0)
myArr := []int{}

2.获取元素

// 通过下标获取 下标从0开始
print(myArr[0])

3.添加元素

my_arr = append(myArr, 1)
print(myArr) // [1]

4.删除元素

// Go没有提供删除数组中元素的方法 但是可以使用append来达到效果

// 1.删除i位置的元素 - 原理就是把第i个位置空下去了
append(myArr[:i], myArr[i+1:]...)

// 2.直接删除元素
for i, _ := range myArr {
    if myArr[i] == obj {
        myArr = append(array[:i], array[i+1:]...)
        break
    }
}

// 3.封装方法
func remove(arrayInterface interface{}, obj interface{}) interface{} {

    switch arrayInterface.(type) {

    case []int:
        array := arrayInterface.([]int)
        for i, _ := range array {
            if array[i] == obj {
                arrayInterface = append(array[:i], array[i+1:]...)
                return arrayInterface
            }
        }
        break

    case []string:
        array := arrayInterface.([]string)
        for i, _ := range array {
            if array[i] == obj {
                arrayInterface = append(array[:i], array[i+1:]...)
                return arrayInterface
            }
        }
        break
    }

    return arrayInterface

}

// 使用
myArr2 := []string{"1", "2", "3"}
fmt.Println(myArr2)
myArr2 = remove(myArr2, "2").([]string)
fmt.Println(myArr2)

5.截取元素

myArr2 = myArr[0:2] // [1, 2]
myArr2 = myArr[:2]  // [1, 2]
myArr2 = myArr[1:2] // [2]
myArr2 = myArr[1:]  // [2, 3]

6.拼接数组

myArr = append(myArr, []int{6, 7, 8}...)
fmt.Println(myArr)

🍎 字典

1.定义字典

var myDic = make(map[string]string)
myDic["name"] = "张三"
myDic["age"] = "18"
// 或者
myDic := map[string]string{
    "name": "张三",
    "age": "18",
}

2.获取元素

str := myDic["name"]
fmt.Println(str) // 张三

3.添加元素

myDic["gender"] = "男"
fmt.Println(myDic) // map[age:18 gender:男 name:张三]

4.删除元素

delete(myDic, "name")
fmt.Println(myDic) // map[age:18]

5.拼接字典

// 官方没有提供 但是可以自己写 当然这是不健全的
func Append(dictInterface1 interface{}, dictInterface2 interface{}) interface{}  {
    switch dictInterface1.(type) {
    case map[string]string:
        dict1, _ := dictInterface1.(map[string]string)
        dict2, _ := dictInterface2.(map[string]string)
        for k, v := range dict2 {
            dict1[k] = v
        }
        return dict1
    }
    return dictInterface1
}
// 用法
myDic = Append(myDic, map[string]string{"gender": "男", "cat": "objcat"}).(map[string]string)
fmt.Println(myDic)

🍎 集合

go 没有集合的概念 但是可以用数组代替

1.创建集合

// 定长数组
var myArr [10]string
myArr := [10]int{1, 2, 3}

// 动态数组
var myArr = make([]int, 0)
myArr := []int{}

1.并集

func union(slice1, slice2 []string) []string {
    m := make(map[string]int)
    for _, v := range slice1 {
        m[v]++
    }

    for _, v := range slice2 {
        times, _ := m[v]
        if times == 0 {
            slice1 = append(slice1, v)
        }
    }
    return slice1
}

2.交集

func intersect(slice1, slice2 []string) []string {
    m := make(map[string]int)
    nn := make([]string, 0)
    for _, v := range slice1 {
        m[v]++
    }
 
    for _, v := range slice2 {
        times, _ := m[v]
        if times == 1 {
            nn = append(nn, v)
        }
    }
    return nn
}

3.补集

func difference(slice1, slice2 []string) []string {
    m := make(map[string]int)
    nn := make([]string, 0)
    inter := intersect(slice1, slice2)
    for _, v := range inter {
        m[v]++
    }
 
    for _, value := range slice1 {
        times, _ := m[value]
        if times == 0 {
            nn = append(nn, value)
        }
    }
    return nn
}

🍎 条件语句

1.if

a := 1
// 如果a等于1 执行条件
if a == 1 {
  fmt.Println("a等于1")
}

2.if - else if

a := 1
// 如果a等于1执行1 如果a等于2执行2
if a == 1 {
  fmt.Println("a等于1")
} else if a == 2 {
  fmt.Println("a等于2")
}

3.if - else if - else

a := 1
// 如果都不等 执行else
if a == 1 {
  fmt.Println("a等于1")
} else if a == 2 {
  fmt.Println("a等于2")
} else {
  fmt.Println("a既不等于1也不等于2")
}

🍎 循环语句

1.for

for i := 0; i < 10; i++ {
  fmt.Println(i)
}

// 遍历数组
for i, v := range []int{1, 2, 3, 4} {
  fmt.Println("下标 ", i)
  fmt.Println("值", v)
}

// 遍历字典
my_dic := map[string]string{"name": "张三", "age": "18"}
fmt.Println(my_dic)

for k, v := range my_dic {
  // key
  fmt.Println(k)
  // value
  fmt.Println(v)
}

2.while

// go没有while 但是可以用for代替
for i := 0; ; i++ {
  fmt.Println(i)
  if i == 1000 {
    break
  }
}

🍎 类和对象

1.类

type Person struct {
    
}

2.定义成员变量

type Person struct {
    name string
    age int
}

// 实例化
func main() {
    per := Person{"张三", 18}
}

3.定义构造函数

// go没有构造函数 但是可以单独写一个方法代替
type Person struct {
    name string
    age int
}

func NewPerson(name string, age int) Person {
    return Person{name, age}
}
        
func main() {
    per := NewPerson("张三", 18)
    fmt.Println(per)
}

4.定义方法

func (this *Person)say()  {
    fmt.Println("人说")
}

// 调用
func main() {
    per := Person{"张三", 18}
    per.say()
}

5.继承

type Student struct {
    Person
    id int
}

// 实例化
func main() {
    per := Person{"张三", 18}
    per.say()
    stu := Student{per, 1}
    fmt.Println(stu) // {{张三 18} 1}
}

6.重写方法

type Student struct {
    Person
    id int
}

func (this *Student)say()  {
    fmt.Println("学生说")
}

func main() {
    per := Person{"张三", 18}
    per.say()
    stu := Student{per, 1}
    stu.say() // 学生说
}

finally enjoy it.

by objcat

2021.04.27

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容