专科 java转go 翱翔之路(一)基础语法:变量声明,匿名函数,结构体,函数,map
本人專科!在太原干了一年了,想從java轉go,上班中自學go,明年找go語言相關的工作 立帖為證! 待羽翼豐滿,大風到來,便是我翱翔之時!!!
1.Go語言
1.命令
1.1 查看版本號
go version1.2 查看安裝信息
go env2.資料
2.1 官方文檔
https://studygolang.com/pkgdoc
2.2 md 語法
https://www.appinn.com/markdown/
2.3 go環境的安裝
官網安裝包下載地址為:https://golang.org/dl/
如果打不開可以使用這個地址:https://golang.google.cn/dl/
2.4注意事項
1.把liteIDEA放到go安裝的根目錄下
2.ctrl+F7 編譯運行
3.helloWorld函數
package mainimport "fmt"func main() {fmt.Println("hello go") }2.語法
2.1
2.1聲明變量
var a int fmt.Println("a = ",a)2.1.1 聲明變量特殊語法(常用)
var a int = 40a = 30fmt.Println("a = ", a) //c :=30 == var a int = 40 常用c := 30fmt.Printf("param type is %T\n", c)2.1.2 兩個變量互換位置
i, j := 10, 20i, j = j, ifmt.Printf("i= %d,j = %d\n", i, j)2.1.3 匿名函數互換位置
//匿名函數 _函數配合函數 返回值使用q, w := 10, 20q, _ = w, qfmt.Printf("q= %d\n", q)2.1.4 函數調用
//go函數可以返回多個值 func test() (a, b, c int) {return 1, 2, 3 } //調用函數var c, d, e intc, d, e = test() //return 1,2,32.1.5 匿名函數調用
//匿名函數_, d, _ = test() //return 1,2,3fmt.Printf("c =%d , d =%d ,e =%d\n", c, d, e)2.1.6 常量關鍵字 const
const a int = 10fmt.Printf("a =%d", a)const b = 11.22.1.7 枚舉iota
2.1.7.1 iota常量自動生成器,每個一行,自動累加1
2.1.7.2 iota給常量賦值使用
//1.iota常量自動生成器,每個一行,自動累加1//2.iota給常量賦值使用const (a = iota //0b = iota //1c = iota //2)fmt.Printf("a =%d,b =%d ,c =%d", a, b, c)2.1.7.3 iota遇到const,重置為0
//3.iota遇到const,重置為0const d = iota //0fmt.Printf("d =%d\n", d)2.1.8 字符串
package mainimport "fmt"func main() {var str1 stringstr1 = "abc"fmt.Println("str1 = ", str1)//自動推導類型str2 := "make"fmt.Println("str2 =", str2)//內建函數 長度fmt.Println("len(str2) =", len(str2))}2.1.9 復數
var t complex128 //聲明t = 2.1 + 3.14ifmt.Println("t =", t)//自動推導類型t2 := 3.3 + 4.4ifmt.Printf("t2 type is %T\n", t2)//通過內建函數,取實部和虛部fmt.Println("real t2 = ", real(t2))2.1.10 類型別名
type bigint int64var a biginttype (long int64char byte)var b long = 11var ch char = 'a'fmt.Printf("b = %d, ch = %c\n", b, ch)2.1.11 if類型
//if類型 初始化變量 當a=10時,跳轉到括號if a := 10; a == 10 {fmt.Println("a =", 10)}2.1.11 range類型(迭代)
for i := 0; i < len(str); i++ {fmt.Printf("str[%d] = %c\n", i, str[i])}fmt.Println("------")//i是下標for i, data := range str {fmt.Printf("str[%d]=%c\n", i, data)}fmt.Println("------")for i := range str {fmt.Printf("str[%d]=%c\n", i, str[i])}for i, _ := range str {fmt.Printf("str[%d]=%c\n", i, str[i])}2.1.12 goto類型
//Endfmt.Println("1111")goto Endfmt.Println("222") End:fmt.Println("333")##2.2
2.2.1函數定義(無返回值)
func Myfunc() {a := 111fmt.Println("無參= ", a)} func Myfunc1(a int) {fmt.Println("有參= ", a)} func Myfunc2(a int, b int) {fmt.Printf("a = %d,b=%d\n", a, b) } func Myfunc3(a string, b int, c float32) {fmt.Printf("a = %d,b=%d,c = %d \n,", a, b, c) }func main() {Myfunc()Myfunc1(222)Myfunc2(333, 444)Myfunc3("555", 666, 777.1) }2.2.2函數定義(有返回值)
//有返回值 func Myfunc2(a int, b int) (max int, mix int) {max = amix = breturn //有返回值的函數,必須通過return返回 }func main() {var a int_, a = Myfunc2(333, 444)fmt.Println("a=", a)}2.2.3函數類型
func addF(a int, b int) int {return a + b } func minF(a int, b int) int {return a - b }//定義函數類型 //FuncType是一個函數類型 type FuncType func(int, int) int //沒有函數名字 沒有{}func main() {var result intvar TestF = FuncTypeTestF = minFresult = TestF(20, 10)fmt.Println("a=", result) }2.2.4函數類型(回調函數,多態)
func add(a int, b int) int {return a + b }// func addF(a int, b int, dtest FuncType) (result int) {result = dtest(a, b)return }//定義函數類型 //FuncType是一個函數類型 type FuncType func(int, int) int //沒有函數名字 沒有{}func main() {a := addF(1, 1, add)fmt.Println("a =", a) }2.2.5匿名函數+閉包
func main() {a := 10b := 20//1.定義匿名函數f1 := func() {fmt.Println("a = ", a)fmt.Println("b = ", b)}//2.匿名函數類型type FuncType1 func()var f2 FuncType1f2 = f1f2()fmt.Println("a =", a)//3.定義匿名函數func() {fmt.Println("a = ", a)fmt.Println("b = ", b)}()//()表示調用此函數//4 有參匿名函數f4 := func(a,b int) {fmt.Println("a = ", a)fmt.Println("b = ", b)}f4(4,5)//5.無名匿名帶參數func(a,b int) {fmt.Println("a = ", a)fmt.Println("b = ", b)}(5,6)//()表示調用此函數//6.匿名函數有參有返回值x,y = func(i,j int)(max,min int){max = imin = jreturn }(10,20)}2.2.5閉包 匿名函數 變量
func test2() func() int {var x int //沒有初始化,值為0return func() int {x++return x * x} }func main() {f := test2()//閉包-不關心變量和常量是否已經超出作用于//只要閉包還在使用它,這些變量就還存在fmt.Println(f()) //1fmt.Println(f()) //4fmt.Println(f()) //9 }2.2.6 defer的使用
//defer延遲調用 main函數結束前調用defer fmt.Println("bbb")fmt.Println("aaaaa") //有多個defer語句,則是 先進后出 哪怕函數出錯 依舊會執行 defer fmt.Println("111") defer fmt.Println("222") defer fmt.Println("333")//匿名函數表示,把變量賦值過去 但是沒有調用defer func(a,b int){fmt.Printf("a = %d ,b = %c\n",a,b)}(10,20)2.2.7 獲取命令行參數
func main() {//要先go build 成 exelist := os.Argsn := len(list)fmt.Println("n =", n)for i := 0; i < n; i++ {fmt.Printf("list[%d] = %s\n", i, list[i])}for i, data := range list {fmt.Printf("list[%d] = %s\n", i, data)} }2.2.8 變量
1.不同作用域可以有同名變量 2.使用變量的原則,就近原則2.2.9 導入導出包
//給包起別名 import io "fmt" io.Println("起別名") //忽略包 import _ "fmt"2.2.10 init函數
先執行 init函數 在執行main函數
2.3 復合類型
2.3.1聲明變量 指針類型
//變量兩含義 1內存 2地址var num int = 10fmt.Printf("a = %d\n ", num)fmt.Printf("a = %v\n ", &num)//保存變量的地址 需要指針類型var p *intp = &numfmt.Printf("p = %v\n ,&a = %v\n ", p, &num)2.3.2默認值 nil new函數
var p *intp = nilfmt.Println("平= ", p)//p := new(int)*p = 7772.3.3數組定義賦值
func main() {var arr [20]intfor i := 0; i < len(arr); i++ {arr[i] = i + 1fmt.Printf("arr[%d] = %d\n", i, arr[i])}//數組定義 置值,其他值為0arr1 := [5]int{1, 2, 3}//指定位置賦值arr2 := [5]int{2: 1, 3: 4}fmt.Println(arr2)}2.3.4 隨機數
import "fmt" import "time" import "math/rand" func main() {//設置隨機數種子rand.Seed(time.Now().UnixNano()) //當前的系統執行時間for i := 0; i < 5; i++ {fmt.Println("rand =", rand.Intn(100))}}2.3.5數組指針
import "fmt" import "time" import "math/rand" //數組指針 //*p 代表指針所指向的內存,就是實參 func modify(p *[5]int) {//p[0] = 66(*p)[0] = 666 }2.3.6切片spilt
func main() {a := []int{1, 2, 3, 54, 5, 7, 89, 6}//[low:high:max]//下標起點 下標終點 (左閉右開) 容量(max-low)s := a[0:3:5]fmt.Println("s = ", s) //[1 2 3]fmt.Println("s len =", len(s)) //長度 3fmt.Println("s cap =", cap(s)) //容量 5//創建切片b := []int{}//給切片追加一個成員b=append(b,11)//不寫默認0 從0開始取3個元素.容量為 5-0s := a[:3:5]}2.3.6切片切切片
//切片切切片a := []int{1, 2, 3, 4, 5, 7, 8, 9}s1 := a[1:3] //[2,3]fmt.Println("s1 =", s1)s2 := s1[1:5] //[3,4,5,7]fmt.Println("s1 =", s2)2.3.7 copy函數
a := []int{1, 2, 3, 4, 5}b := []int{6, 7, 8, 9, 10, 11}copy(a, b)fmt.Println("a =", a) //{6, 7, 8, 9, 10}fmt.Println("b =", b) //{6, 7, 8, 9, 10,11}2.3.7 map
2.3.7.1 map的定義
func deleMap(mapV map[int]string) {delete(mapV, 1) }//創建mapvar map1 map[int]stringfmt.Println("a =", map1) //{6, 7, 8, 9, 10}//通過make創建map2 := make(map[int]string)map2[1] = "make"map2[2] = "sss"//定義初始化map3 := map[int]string{1: "a", 2: 'b'}//刪除delete(map3, 1)fmt.Println(map3)//定義函數deleMap(map3)2.3.7.2 map的循環
//定義初始化map3 := map[int]string{1: "a", 2: "b"}//循環for key, value := range map3 {fmt.Printf("%d =====>%s\n", key, value)}//判斷一個Key值是否存在//第一個返回值為key所對應的valuevalue, ok := m[1]if ok == true {fmt.Printf("m[1] =", value)} else {fmt.Printf("key不存在")}2.3.8 結構體
type Student struct {id intname stringsex byteage intaddr string }func main() {var s1 Student = Student{1, "make", 'm', 20, "背景"}fmt.Println(s1)//{1 make 109 20 背景}//指定聲明s2 := Student{name: "make", addr: "背景"}fmt.Println(s2)//{0 make 0 0 背景}//聲明指針變量s3 := &Student{name: "make", addr: "背景"}fmt.Println(s3)//&{0 make 0 0 背景}var s4 *Student = &Student{1, "make", 'm', 20, "背景"}fmt.Printf("s4 type= %T\n", s4)//s4 type= *main.Studentfmt.Println(s4)//&{1 make 109 20 背景}//先定義在賦值var stu1 Studentstu1.id = 1stu1.name = "mike"stu1.sex = '5'fmt.Println(stu1) //{1 mike 53 0 }//new申請stu2 := new(Student)stu2.id = 1stu2.name = "mike"stu2.sex = '5'fmt.Println(stu2) //&{1 mike 53 0 }}2.3.9 可見性
如果想使用別的包的函數,結構體類型,結構體成員,函數名,類型名,結構體成員變量名
首字母必須大寫,可見
如果首字母小寫,只能能在同一個包里使用
?
?
通用
1.fmt.Sprintf (格式化輸出)
%v 按值的本來值輸出%+v 在 %v 的基礎上,對結構體字段名和值進行展開 %#v 輸出 Go 語言語法格式的值%T 輸出 Go 語言語法格式的類型和值%% 輸出 %% 本體%b 整型以二進制方式顯示%o 整型以八進制方式顯示%d 整型以十進制方式顯示%x 整型以 十六進制顯示%X 整型以十六進制、字母大寫方式顯示%U Unicode 字符%f 浮點數%p 指針,十六進制方式顯示?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
53 0 }
}
### 2.3.9 可見性 如果想使用別的包的函數,結構體類型,結構體成員,函數名,類型名,結構體成員變量名 **首字母必須大寫,可見**如果首字母小寫,只能能在**同一個包里使用**? ? # 通用 ## 1.fmt.Sprintf (格式化輸出) %v 按值的本來值輸出%+v 在 %v 的基礎上,對結構體字段名和值進行展開
%#v 輸出 Go 語言語法格式的值
%T 輸出 Go 語言語法格式的類型和值
%% 輸出 %% 本體
%b 整型以二進制方式顯示
%o 整型以八進制方式顯示
%d 整型以十進制方式顯示
%x 整型以 十六進制顯示
%X 整型以十六進制、字母大寫方式顯示
%U Unicode 字符
%f 浮點數
%p 指針,十六進制方式顯示
總結
以上是生活随笔為你收集整理的专科 java转go 翱翔之路(一)基础语法:变量声明,匿名函数,结构体,函数,map的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jfinal 对象列表返回前台json数
- 下一篇: 专科 java转go 翱翔之路(二)基础