V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  siteshen  ›  全部回复第 4 页 / 共 22 页
回复总数  422
1  2  3  4  5  6  7  8  9  10 ... 22  
2020-07-07 11:34:02 +08:00
回复了 vcfghtyjc 创建的主题 Python 求推荐 Sphinx 的使用教程
1. 按照 quick-start 生成配置,编译并查看基本文档
2. 研究如何递归地生成模块文档
3. 研究配置特定插件(如 Django Flask gRPC 等)
4. 规划文档架构( Quick Start / Tutorial / References),编写 rst 文件
@neoblackcap 我的回复只是说明 gin 框架没有按照 go 官方推荐的方式组织代码,按我的设想,应该用 NewRouter,DefaultRouter 等含义更清晰的函数名。详细解释如下:

按 go 的官方规范,有区分度的结构体应该是由最后一层 `package + struct name` 组成。举例如下: http.Router, rpc.Request, websocket.Message, router.New(), mux.Default() (其中一些是现编的)等,还有上面有人提到的 gin.Middleware, gin.Engine (虽然不知道 Engine 具体是什么,但可以猜测是某种实体)。

而 gin.New(), gin.Default() 等的返回值是什么?参照对 router.New(), message.New() (分别返回 Router / Message )等的理解,应该是返回一个叫「 Gin 」的东西,而 Gin 是什么呢?我的理解是一个框架,框架名作为实体?这样的代码读起来就很困惑了。

问题出在哪呢? New / Default 不带有任何实体标识符,而实体由 `package + structname` 确定,既然不能用 struct name 来表示类型, 那就应该用 package 的最后一层来表示了。但 gin 这里没有,导致了一部分人对 gin.New(), gin.Default() 这样的代码不明所以。

如果 go 官方代码有最后一层 `package + struct name` 仍然定义不清晰的,欢迎打脸。

https://blog.golang.org/package-names 「 Go code is organized into packages. Within a package, code can refer to any identifier (name) defined within, while clients of the package may only reference the package's exported types, functions, constants, and variables. Such references always include the package name as a prefix: foo.Bar refers to the exported name Bar in the imported package named foo.」
恐怕问题不在变量 r,而是在 API gin.Default 上,听过没用过 gin 的根本不知道 Default 返回值是什么。
r := gin.DefaultRouter() 这样是不是就比较容易懂了?(没看过 gin 源码,姑且认为返回的是叫 Router 的东西)

给几个我觉得不错的 API 命名供参考:

net/http.DefaultServeMux
github.com/go-chi/chi.NewRouter()
github.com/gorilla/mux.NewRouter()
2020-06-17 15:10:36 +08:00
回复了 fxjson 创建的主题 随想 热爱编程,脱离了真实的生活
@dacapoday 编程语言是对自然语言拙劣的模仿吗?我认为是对自然语言的改进,至少解决了自然语言歧义太多的问题。
2020-06-09 09:10:45 +08:00
回复了 ranlele 创建的主题 Django Diango 版本选择问题
用当前最新稳定版的,这样两年后你用的框架还有用户。
2020-06-04 14:49:43 +08:00
回复了 xueyoucai 创建的主题 Python Python 接口接口
1. 找个 Flask 的入门教程,学习怎么构建简单的 API ;
2. 重构你的脚本,对外提供一个 update_data() 之类的函数;
3. 整合 Flask 和你的脚本。

最终能得到类似下面的代码(现场手写的,请自辨):


from your_script import update_data

app = Flask()

@app.route("/api/update-data")
def update_data_handler():
kwargs = app.get_request_args() # 需要去查 flask 怎么获取参数
update_data(user_id=kwargs['user'], post_ids=kwargs['post_ids'])
return {"success": true}


if __name__ == "__main__":
app.run()
2020-06-01 14:17:26 +08:00
回复了 qqqccc 创建的主题 程序员 fastjson 又爆 bug 了!快来看看是否受影响
@yuzo555 Go:我怀疑你在说我,但是我没有证据。
2020-05-31 20:27:45 +08:00
回复了 dangyuluo 创建的主题 程序员 成都的 V 友,下个月中过路过,请你吃饭,我们聊一聊
@delectate 聊麻将 AI 吗?
2020-05-27 09:30:50 +08:00
回复了 subpo 创建的主题 奇思妙想 回到乡下,过上自给自足的生活有没有可行性?
我很久之前就想过,但有一个很大的问题,我担心我种地养不活我自己。
2020-05-18 16:29:09 +08:00
回复了 Wenco 创建的主题 Go 编程语言 api 数据返回过滤不需要的字段
@Wenco NewUserResponse 是其他语言中的构造函数,这样对生成的 UserResponse 可控(甚至 UserResponse 可以设计为 private 的 userResponse )。

UserResponse 也是可以复用的,下面这个例子就会复用 BasicUser 。
用户列表可能就只需要 BasicUser (用户名、头像),
查看用户详情时可能需要 UserDetail (BasicUser + 粉丝数、文章数),
查看自己的详情时可能需要 Me ( UserDetail + 收入 + 草稿箱中的文章数)。


struct BasicUser {
username string
avatar url
}

// API readUser
struct UserDetail {
UserResponse
bio string
location string
n_follower int
n_following int
n_posts int
}

// 用户查看自己信息的时
struct Me {
UserDetail
n_fav_posts int
total_cost double
total_income double
n_draft_posts int
}

// API listUser
struct UserList {
users BasicUser[]
}
2020-05-18 09:49:37 +08:00
回复了 Wenco 创建的主题 Go 编程语言 api 数据返回过滤不需要的字段
@siteshen 简单的说,就是你们少了一层抽象:API response 。加上之后 API 返回字段就只和 API response 层相关,不需要和 model 、logic 层耦合(甚至 model 用 ORM 实现、甚至存储换成 redis/mongodb 也不会影响前端)。
2020-05-18 09:45:34 +08:00
回复了 Wenco 创建的主题 Go 编程语言 api 数据返回过滤不需要的字段
// models/user.go
struct User {
username string
password stirng
age int
...
}

// responses/user.go
struct UserResponse {
username string
age int
...
}

func NewUserResponse(user *User) {
...
}

// handlers/user.go
funct ReadUserHandler(req, res) {
user = models.ReadUserById(req.UserId)
return response.NewUserResponse(user)
}
建议明确前后端的界限,前端只是把后端当个黑盒子使用,做前端的只能「建议」后端怎么做(反之亦然)。

前端遇到问题,只需要告诉后端某个请求有问题,并提供 curl 命令、预期结果和实际结果。

至于后端是用断点、log 、买个啄木鸟还是拍电脑,都与前端无关。
2020-05-13 09:26:40 +08:00
回复了 murmur 创建的主题 程序员 日常开吹:竹板这么一打,今天夸一夸,为什么我喜欢 Vue
没人关心这贴子和「竹板」有什么关系吗?
2020-05-11 15:27:48 +08:00
回复了 ybw 创建的主题 程序员 写代码最大的痛苦, 在于理解别人的代码
理解别人的代码确实很困难,因为这不止取决于看代码的人,还取决于写代码的人。

但要做到以后能理解自己的代码还是能做到的:
1. 尽量用最高的标准要求自己的代码;
2. 不那么明显的工具函数会有简单的测试;
3. 不得不 HACK 的代码会用注释写明原因。

不夸张的说,我现在还能较容易地看懂我三年前写的代码。
2020-04-30 17:58:40 +08:00
回复了 RobinCheng 创建的主题 iPhone iPhone 强制 6 位密码,经常输完密码发现少 1 位。。。
俺也一样
2020-04-26 12:14:41 +08:00
回复了 srs1995 创建的主题 Java 野路子 Java
代码没什么问题,不过倒是 signature 的算法和一般的不一样。

一般是这种:
输入是: {"a": 123, "c": 292, "b": 299}
签名的字符串是:a=123&b=299&c=292

很少会要求 JSON 的 key 是「有序」的。这通常意味着要么依赖内置的排序(不同语言的排序方式可能不一样),要么手动对 JSON 的 key 排序(麻烦,某些语言甚至只能用拼接字符串的方式实现所谓的 JSON encode )。
1  2  3  4  5  6  7  8  9  10 ... 22  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4991 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 42ms · UTC 01:13 · PVG 09:13 · LAX 18:13 · JFK 21:13
Developed with CodeLauncher
♥ Do have faith in what you're doing.