阅读前,读者需要掌握java的语法基础,最好有python和c++的基础。
方便理解。
参考:
Golang官方:
https://golang.google.cn/tour/welcome/1
bilibili:
【尚硅谷】Golang入门到实战教程丨一套精通GO语言
两种方式
从Java转go,需要注意:
这里类似于c语言,与c如出一辙。
找不到文件?
可能是名字写错了。。
语法错误
大多是依法不习惯
package mian(我遇到的,不是main居然不能启动)
官方推荐:
尽量使用行注释
正确的缩进和空白。
{
:其中代码块的这个左阔符必须在方法同一行,不允许换行。
代码一行不要超过80字符。类比python
采用换行。
中文文档
英文文档
https://pkg.go.dev/search?q=fmt
go中函数的使用:
使用包名package加函数名字进行调用。
win平台的熟悉,win的操作终端。terminal
变量三要素:
变量名+ 值 + 数据类型
golang中变量的使用有三种方式:
使用:
var n1, n2, n3 int
var n, m = 1, 2
\
使用细节:
unsafe.sizeof(Type)
: 字节大小func Sprintf( format string, a …interface{} ) string
interface{} 表示任何数据类型
strconv. FormatInt( num int, base int )
func strconv. Itoa(num int)string
其中base 是转换进制
strconv包
func parse**
内存布局?
如果您有Java基础,这些个就差不太多。
特别的,go里面没有三元运算。
细节,易错:
++,–,只能独立使用且只能写在变量之后,区别于Java/c;更简洁。
&&:短路与
||:短路或
交换两个数:
在Go里面有四种方式:
注意GoLang中没有>>> 无符号右移,区别于Java。
其他情况类似相同。
--------------------------------更 -----------------------新----------------------------------
就是一般代码的顺序执行
特别的,表达式括号不是强制不写,可以写,但是没必要。
单分支
双分支
多分支
除了有,if-else if -else
还有:
switch:
这里区别于Java,
区别与相同:
switch后可以不加表达式:此时功能类似于if-else分支
switch后面也可以直接声明定义一个变量,分号结束,但是不推荐使用。
不用break,
case里面可以放多个表达式,用逗号隔开
同:
for i:=0;i<n;i++{
//...
}
for ;true;{// for true{ ... }
//...
}
基础部分待更新
…
----------------------------更-----------------------------------------------------新2----------------------------------
Go Web 框架:
注意:go本身有net/http库对web开发,基于此出现了很多框架:
- Gin:微框架
- Kratos(b站开源)
- Beego:快速开发Go应用的框架, 灵感:tornado,sinatra,flask。
- Iris
- Ginex(字节开源)
需要了解:go get:类似于git clone
开门第一课:先看看入门hello world:
package main
import (
_ "fmt"
"github.com/gin-gonic/gin"
)
func main() {
// create one server
r := gin.Default()
// some other operation:
// link to mysql etc.
// get
r.GET("/halo", func(c *gin.Context) {
c.JSON(200, gin.H{
"msg": "this the gin simple framework",
})
})
// spring boot run; server port
err := r.Run()
if err != nil {
return
}
}
用什么?
和Java 一样,和前端,用RestFul API。
get: /restful
post: /restful
put: /restful
delete: /restful
// 后端写静态页面并传值给静态的html:
// 加载静态页面:
r.LoadHTMLFiles("templates/*")
r.Static(relative, root)
// get
r.GET("/halo", func(c *gin.Context) {
c.JSON(200, gin.H{
"msg": "cheng jiang with cheng haiyan",
})
c.HTML(http.StatusOK, "index.html", gin.H{
"msg": "this the back send data",
})
})
非rest ful
// halo/info?name=chengjiang&age=20
r.GET("/halo/info", func(c *gin.Context) {
name,age := c.Query("name"), c.Query("age")
fmt.Println(name, age)
})
restful:
// restful:
// halo/info/chengjiang/20
r.GET("/halo/info/:name/:age", func(c *gin.Context) {
name, age := c.Param("name"), c.Param("age")
fmt.Println(name, age)
})
r.POST("/halo", func(c *gin.Context) {
data, _ := c.GetRawData()
var m *map[string]interface{}
_ = json.Unmarshal(data, m)
c.JSON(http.StatusOK, m)
})
表单:
r.POST("/halo", func(c *gin.Context) {
name := c.PostForm("name")
//...
})
路由:
c. Redirct(code, url)
接下来重点来了昂:
// group
group := r.Group("/user")
{
group.GET("/info")
// ... post, put, delete
}// url: user/add
预处理,登录,授权,验证,分页,耗时统计, 支付
func myHandler() gin.HandlerFunc {
return func(c *gin.Context) {
c.Set("sesion", "session-id")
c.Next() // run
c.Abort() // refuse
}
}
//main:
r.GET("/halo/info", myHandler, func(c *gin.context){
// ...
})
基于Go的ORM 库,实现数据库操作。
安装:
go get xorm.io/xorm
使用的是:github.com/go-redis/redis/v8
----------------------------更-----------------------------------------------------新----------------------------------
更新于2023.02.07
谈谈从Java到GoLang的实习之路叭:
技术积累:
从开始实习到目前:
使用Go结合框架Kratos和socketio简易版线上聊天:
golang 测试代码:
// @author
// @date 2023/1/11
// @note
package test
import (
"fmt"
socketio "github.com/googollee/go-socket.io"
"log"
"net/http"
"strings"
"testing"
)
func TestSocketio(t *testing.T) {
server := socketio.NewServer(nil)
server.OnConnect("/", func(s socketio.Conn) error {
s.SetContext("")
fmt.Println("connected: ", s.ID())
// Join: self-defining, the room:
s.Join("my_room")
return nil
})
// 事件
server.OnEvent("/", "notice", func(s socketio.Conn, msg string) {
fmt.Println("notice:", msg)
var msgs = strings.Split(msg, "|")
var name = msgs[0]
var mesg = msgs[1]
server.BroadcastToRoom("/", "my_room", "reply", "the user: "+name+", this is to web: "+mesg)
})
server.OnEvent("/chat", "msg", func(s socketio.Conn, msg string) string {
s.SetContext(msg)
return "recv " + msg
})
server.OnEvent("/", "bye", func(s socketio.Conn) string {
last := s.Context().(string)
s.Emit("bye", last)
s.Close()
return last
})
// error
server.OnError("/", func(s socketio.Conn, e error) {
fmt.Println("meet error: ", e)
})
server.OnDisconnect("/", func(s socketio.Conn, reason string) {
fmt.Println("closed", reason)
s.LeaveAll()
})
//
go server.Serve()
defer server.Close()
http.Handle("/socket.io/", server)
http.Handle("/", http.FileServer(http.Dir("./asset")))
log.Println("Serving at localhost:8000...")
log.Fatal(http.ListenAndServe(":8000", nil))
}