?? 簡介
Go 是一個開源的編程語言,它能讓構(gòu)造簡單甲雅、可靠且高效的軟件變得容易。
Go是從2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持開發(fā),后來還加入了Ian Lance Taylor, Russ Cox等人钞钙,并最終于2009年11月開源坦辟,在2012年早些時候發(fā)布了Go 1穩(wěn)定版本】睿現(xiàn)在Go的開發(fā)已經(jīng)是完全開放的,并且擁有一個活躍的社區(qū)锉走。
?? 環(huán)境搭建
官方網(wǎng)站
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"
// 數(shù)組
d := []int{1, 2, 3}
// 字典
e := map[string]string{"name": "objcat", "age": "18"}
?? 函數(shù)
1.無參數(shù)無返回值
func hello() {
fmt.Println("hello world!")
}
func main() {
hello()
}
2.有參數(shù)無返回值
func hello(text string) {
fmt.Println(text)
}
func main() {
hello("hello world!")
}
3.有參數(shù)有返回值
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
// 數(shù)組拼接
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))
}
?? 數(shù)組
1.定義數(shù)組
// 定長數(shù)組
var myArr [10]string
myArr := [10]int{1, 2, 3}
// 動態(tài)數(shù)組
var myArr = make([]int, 0)
myArr := []int{}
2.獲取元素
// 通過下標獲取 下標從0開始
print(myArr[0])
3.添加元素
my_arr = append(myArr, 1)
print(myArr) // [1]
4.刪除元素
// Go沒有提供刪除數(shù)組中元素的方法 但是可以使用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.拼接數(shù)組
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.拼接字典
// 官方?jīng)]有提供 但是可以自己寫 當然這是不健全的
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 沒有集合的概念 但是可以用數(shù)組代替
1.創(chuàng)建集合
// 定長數(shù)組
var myArr [10]string
myArr := [10]int{1, 2, 3}
// 動態(tài)數(shù)組
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 執(zhí)行條件
if a == 1 {
fmt.Println("a等于1")
}
2.if - else if
a := 1
// 如果a等于1執(zhí)行1 如果a等于2執(zhí)行2
if a == 1 {
fmt.Println("a等于1")
} else if a == 2 {
fmt.Println("a等于2")
}
3.if - else if - else
a := 1
// 如果都不等 執(zhí)行else
if a == 1 {
fmt.Println("a等于1")
} else if a == 2 {
fmt.Println("a等于2")
} else {
fmt.Println("a既不等于1也不等于2")
}
?? 循環(huán)語句
1.for
for i := 0; i < 10; i++ {
fmt.Println(i)
}
// 遍歷數(shù)組
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.定義構(gòu)造函數(shù)
// go沒有構(gòu)造函數(shù) 但是可以單獨寫一個方法代替
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("人說")
}
// 調(diào)用
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() // 學生說
}