一.几种公共方法
网站建设哪家好,找创新互联公司!专注于网页设计、网站建设、微信开发、微信小程序、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了延平免费建站欢迎大家使用!
1)Print: 输出到控制台(不接受任何格式化,它等价于对每一个操作数都应用 %v)
print 在golang中 是属于输出到标准错误流中并打印,官方不建议写程序时候用它。可以再debug时候用
2)Println: 输出到控制台并换行
3)Printf : 只可以打印出格式化的字符串。只可以直接输出字符串类型的变量(不可以输出整形变量和整形等)
4)Sprintf:格式化并返回一个字符串而不带任何输出
5)Fprintf:来格式化并输出到 io.Writers 而不是 os.Stdout
二.带占位符输出--网址:
和python差不多的道理,这里简单补充
v 值的默认格式
%+v 添加字段名(如结构体)
%#v 相应值的Go语法表示
%T 相应值的类型的Go语法表示
%% 字面上的百分号,并非值的占位符
%c 相应Unicode码点所表示的字符
%x 十六进制表示,字母形式为小写 a-f
%X 十六进制表示,字母形式为大写 A-F
%U Unicode格式:U+1234,等同于 "U+%04X"
1
方法1:打开游戏设置选项-游戏设置
2
打开【启用开发者控制台(~)】,然后按“~”,即可调出控制台。
3
方法2:Steam-库-右键游戏属性-常规选项卡-设置启动选项,然后输入
-console
这个参数即可。
首先你应该建立一个WIN32程序项目,而不是控制台项目。在添加这些代码:#include#include#include#include#definepi3.1415LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函数说明//--------------------以下初始化窗口类-----------------//intWINAPIWinMain(HINSTANCEhInstance,//WinMain函数说明HINSTANCEhPrevInst,LPSTRlpszCmdLine,intnCmdShow){HWNDhwnd;MSGMsg;WNDCLASSwndclass;charlpszClassName[]="窗口";//窗口类名charlpszTitle[]="窗口示例程序";//窗口标题名//窗口类的定义wndclass.style=0;//窗口类型为默认类型wndclass.lpfnWndProc=WndProc;//窗口处理函数为WndProcwndclass.cbClsExtra=0;//窗口类无扩展wndclass.cbWndExtra=0;//窗口实例无扩展wndclass.hInstance=hInstance;//当前实例句柄wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//使用默认图标wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//窗口采用箭头光标wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景为白色wndclass.lpszMenuName=NULL;//窗口中无菜单wndclass.lpszClassName=lpszClassName;//窗口类名为“窗口示例”//--------------------以下进行窗口类的注册-------------if(!RegisterClass(wndclass))//若注册失败则发出警告声音{MessageBeep(0);returnFALSE;}//创建窗口操作hwnd=CreateWindow(lpszClassName,//窗口类名lpszTitle,//窗口实例的标题名WS_OVERLAPPEDWINDOW,//窗口的风格CW_USEDEFAULT,CW_USEDEFAULT,//窗口左上角的坐标为默认值CW_USEDEFAULT,CW_USEDEFAULT,//窗口的高和宽为默认值NULL,//此窗口无父窗口NULL,//此窗口无主菜单hInstance,//应用程序的当前句柄NULL);//不使用该值ShowWindow(hwnd,nCmdShow);//显示窗口UpdateWindow(hwnd);//绘制用户区while(GetMessage(Msg,NULL,0,0))//消息循环{TranslateMessage(Msg);DispatchMessage(Msg);}returnMsg.wParam;//程序终止时将信息返回系统}//窗口函数LRESULTCALLBACKWndProc(HWNDhWnd,UINTiMessage,WPARAMwParam,LPARAMlParam){switch(iMessage){//此处添加消息处理代码}switch(iMessage){caseWM_DESTROY:PostQuitMessage(0);//调用该函数发出WM_QUIT消息default:returnDefWindowProc(hWnd,iMessage,wParam,lParam);}return0;}
本教程介绍了使用 Godatabase/sql及其标准库中的包访问关系数据库的基础知识。
您将使用的database/sql包包括用于连接数据库、执行事务、取消正在进行的操作等的类型和函数。
在本教程中,您将创建一个数据库,然后编写代码来访问该数据库。您的示例项目将是有关老式爵士乐唱片的数据存储库。
首先,为您要编写的代码创建一个文件夹。
1、打开命令提示符并切换到您的主目录。
在 Linux 或 Mac 上:
在 Windows 上:
2、在命令提示符下,为您的代码创建一个名为 data-access 的目录。
3、创建一个模块,您可以在其中管理将在本教程中添加的依赖项。
运行go mod init命令,为其提供新代码的模块路径。
此命令创建一个 go.mod 文件,您添加的依赖项将在其中列出以供跟踪。
注意: 在实际开发中,您会指定一个更符合您自己需求的模块路径。有关更多信息,请参阅一下文章。
GO语言(二十五):管理依赖项(上)
GO语言(二十六):管理依赖项(中)
GO语言(二十七):管理依赖项(下)
接下来,您将创建一个数据库。
在此步骤中,您将创建要使用的数据库。您将使用 DBMS 本身的 CLI 创建数据库和表,以及添加数据。
您将创建一个数据库,其中包含有关黑胶唱片上的老式爵士乐录音的数据。
这里的代码使用MySQL CLI,但大多数 DBMS 都有自己的 CLI,具有类似的功能。
1、打开一个新的命令提示符。
在命令行,登录到您的 DBMS,如下面的 MySQL 示例所示。
2、在mysql命令提示符下,创建一个数据库。
3、切到您刚刚创建的数据库,以便您可以添加表。
4、在文本编辑器的 data-access 文件夹中,创建一个名为 create-tables.sql 的文件来保存用于添加表的 SQL 脚本。
将以下 SQL 代码粘贴到文件中,然后保存文件。
在此 SQL 代码中:
(1)删除名为album表。 首先执行此命令可以让您更轻松地稍后重新运行脚本。
(2)创建一个album包含四列的表:title、artist和price。每行的id值由 DBMS 自动创建。
(3)添加带有值的四行。
5、在mysql命令提示符下,运行您刚刚创建的脚本。
您将使用以下形式的source命令:
6、在 DBMS 命令提示符处,使用SELECT语句来验证您是否已成功创建包含数据的表。
接下来,您将编写一些 Go 代码进行连接,以便进行查询。
现在你已经有了一个包含一些数据的数据库,开始你的 Go 代码。
找到并导入一个数据库驱动程序,该驱动程序会将您通过database/sql包中的函数发出的请求转换为数据库可以理解的请求。
1、在您的浏览器中,访问SQLDrivers wiki 页面以识别您可以使用的驱动程序。
2、使用页面上的列表来识别您将使用的驱动程序。为了在本教程中访问 MySQL,您将使用 Go-MySQL-Driver。
3、请注意驱动程序的包名称 - 此处为github.com/go-sql-driver/mysql.
4、使用您的文本编辑器,创建一个用于编写 Go 代码的文件,并将该文件作为 main.go 保存在您之前创建的数据访问目录中。
5、进入main.go,粘贴以下代码导入驱动包。
在此代码中:
(1)将您的代码添加到main包中,以便您可以独立执行它。
(2)导入 MySQL 驱动程序github.com/go-sql-driver/mysql。
导入驱动程序后,您将开始编写代码以访问数据库。
现在编写一些 Go 代码,让您使用数据库句柄访问数据库。
您将使用指向结构的指针sql.DB,它表示对特定数据库的访问。
编写代码
1、进入 main.go,在import您刚刚添加的代码下方,粘贴以下 Go 代码以创建数据库句柄。
在此代码中:
(3)使用 MySQL 驱动程序Config和FormatDSN类型以收集连接属性并将它们格式化为连接字符串的 DSN。
该Config结构使代码比连接字符串更容易阅读。
(4)调用sql.Open 初始化db变量,传递 FormatDSN。
(5)检查来自 的错误sql.Open。例如,如果您的数据库连接细节格式不正确,它可能会失败。
为了简化代码,您调用log.Fatal结束执行并将错误打印到控制台。在生产代码中,您会希望以更优雅的方式处理错误。
(6)调用DB.Ping以确认连接到数据库有效。在运行时, sql.Open可能不会立即连接,具体取决于驱动程序。您在Ping此处使用以确认 database/sql包可以在需要时连接。
(7)检查来自Ping的错误,以防连接失败。
(8)Ping如果连接成功,则打印一条消息。
文件的顶部现在应该如下所示:
3、保存 main.go。
1、开始跟踪 MySQL 驱动程序模块作为依赖项。
使用go get 添加 github.com/go-sql-driver/mysql 模块作为您自己模块的依赖项。使用点参数表示“获取当前目录中代码的依赖项”。
2、在命令提示符下,设置Go 程序使用的DBUSER和DBPASS环境变量。
在 Linux 或 Mac 上:
在 Windows 上:
3、在包含 main.go 的目录中的命令行中,通过键入go run来运行代码。
连接成功了!
接下来,您将查询一些数据。
日常开发当中需要将golang的log包打印的日志同时输出到控制台和文件,应该如何解决这个问题?
log包可以通过SetOutput()方法指定日志输出的方式(Writer),但是只能指定一个输出的方式(Writer)。我们利用io.MultiWriter()将多个Writer拼成一个Writer使用的特性,把log.Println()输出的内容分流到控制台和文件当中。
原文地址
欢迎golang同胞!在本教程中,我们将研究如何在基于 Go 的程序中与 GraphQL 服务器进行交互。在本教程结束时,我们应该知道如何执行以下操作:
在本教程中,我们将专注于学习 GraphQL 的数据检索方面,并且我们将使用内存中的数据源来支持它。这应该为我们在后续教程的基础上建立一个良好的基础。
好的,所以在我们深入研究之前,我们应该真正了解 GraphQL 的基础知识。作为开发人员,使用它对我们有什么好处?
好吧,考虑使用每天处理数十万甚至数百万请求的系统。传统上,我们会使用位于数据库前面的系统 API,它会返回大量 JSON 响应,其中包含许多我们可能不一定需要的冗余信息。
如果我们正在处理大规模的应用程序,发送冗余数据的成本可能会很高,并且由于有效负载大小会阻塞我们的网络带宽。
GraphQL基本上可以让我们以减少噪音和描述数据,我们希望让我们的检索,从我们的API中检索 只有 我们需要为我们当前的任务/视图/不管。
这只是该技术为我们提供的众多好处的一个例子。希望在接下来的教程系列中,我们会提前看到更多这些好处。
需要注意的重要一点是,GraphQL 不像我们传统的 SQL 那样是一种查询语言。它是位于我们 API 前面的抽象, 不 依赖于任何特定的数据库或存储引擎。
这真的很酷。我们可以建立一个与现有服务商交互的 GraphQL 服务器,然后围绕着这个新的 GraphQL 服务器构建,而不必担心修改现有的 REST API。
让我们看看 RESTful 方法与 GraphQL 方法有何不同。现在,假设我们正在构建一个返回该站点上所有教程的服务,如果我们想要特定教程的信息,我们通常会创建一个 API 端点,允许我们根据 ID 检索特定教程:
如果给定一个 valid ID,这将返回一个响应,看起来像这样:
现在,假设我们想创建一个小部件,列出该作者撰写的书籍 5 个帖子。我们可以点击/author/:id端点以检索该作者撰写的所有帖子,然后进行后续调用以检索前 5 个帖子中的每一个。或者,我们可以制作一个全新的端点来为我们返回这些数据。
这两种解决方案听起来都不是特别吸引人,因为它们会创建不需要的请求量或返回过多的数据,这突出了 RESTful 方法开始出现一些裂缝的地方。
这就是 GraphQL 发挥作用的地方。使用 GraphQL,我们可以定义我们希望在查询中返回的数据的确切结构。所以如果我们想要上面的信息,我们可以创建一个看起来像这样的查询:
这将随后返回我们的教程、该教程的作者和一组表示该作者编写的教程的教程 ID,而无需发送额外的 x 多个 REST 请求来获取信息!那有多好?
好的,现在我们对 GraphQL 以及对它的用途有了更多的了解,让我们在实践中看看它。
我们将使用graphql-go/graphql实现在 Go 中创建一个简单的 GraphQL 服务器 。
让我们首先使用go mod init以下方法初始化我们的项目:
接下来,让我们创建一个名为main.go. 我们将从简单开始创建一个非常简单的 GraphQL 服务器,它具有一个非常简单的解析器:
现在,如果我们尝试运行它,让我们看看会发生什么:
所以,如果一切正常,那么我们就可以设置一个非常简单的 GraphQL 服务器并对这个服务器进行非常简单的查询。
让我们分解上面代码中发生的事情,以便我们可以进一步扩展它。在lines 14-21我们定义我们的Schema. 当我们对我们的 GraphQL API 进行查询时,我们基本上定义了我们想要返回给我们的对象上的哪些字段,因此我们必须在我们的 Schema 重新定义这些字段。
在 上line 17,我们定义了一个解析器函数,每当field请求此特定内容时就会触发该解析器函数。现在,我们只是返回字符串 "world",但我们将实现从这里查询数据库的能力。
让我们看一下main.go文件的第二部分。在line 30我们开始定义query请求领域hello。
然后我们创建一个params结构,其中包含对我们定义的Schema以及我们的RequestString请求的引用 。
最后,在line 36我们执行请求并将请求的结果填充到r. 然后我们进行一些错误处理,然后将响应编组为 JSON 并将其打印到我们的控制台上。
现在我们已经启动并运行了一个非常简单的 GraphQL 服务器,并且我们能够对其进行查询,让我们更进一步,构建一个更复杂的示例。
我们将创建一个 GraphQL 服务器,它返回一系列内存中的教程及其作者,以及对这些特定教程的任何评论。
让我们定义一些struct代表 a Tutorial、 anAuthor和 a 的's Comment:
然后我们可以创建一个非常简单的populate()函数,它将返回一个类型数组Tutorial:
这将为我们提供一个简单的教程列表,然后我们可以稍后解决。
我们将从使用 GraphQL 创建一个新对象开始graphql.NewObject()。我们将使用 GraphQL 的严格类型定义 3 种不同的类型,它们将与structs我们已经定义的 3 种相匹配。
我们的Commentstruct 可以说是最简单的,它只包含一个 string Body,所以我们可以commentType很容易地将其表示为:
接下来,我们将处理该Author结构并将其定义为一个新的 graphql.NewObject(). 这会稍微复杂一些,因为它既有一个 String字段,也有一个Int值列表,这些值代表他们编写的教程的 ID。
最后,让我们定义我们的tutorialTypewhich 将封装 an author和comment's的数组以及 anID和 a title:
现在我们已经定义了我们的Type系统,让我们着手更新我们的 Schema 以反映这些新类型。我们将定义 2 个 distinct Field,第一个将是我们的tutorial字段,它允许我们Tutorials 根据传入查询的 ID检索个人。第二个将是一个list字段,它将允许我们检索Tutorials我们在内存中定义的完整数组。
所以我们已经创建了我们的类型并更新了我们的 GraphQL 模式,我们做得还不错!
让我们尝试使用我们的新 GraphQL 服务器并处理我们提交的查询。让我们来尝试我们的list架构改变query ,我们已经在我们得到main()的功能:
让我们分解一下。所以在我们的查询中,我们有一个特殊的root对象。然后我们在其中说我们想要该list对象上的字段。在返回的名单list,我们希望看到的id,title,comments和 author。
当我们运行它时,我们应该会看到以下输出:
正如我们所见,我们的查询以 JSON 格式返回了我们所有的教程,看起来非常像我们初始查询的结构。
现在让我们尝试对我们的tutorial模式进行查询:
再一次,当我们运行它时,我们应该看到它已经成功地检索了内存中的单独教程ID=1:
完美,看起来我们已经让list我们的tutorial模式和我们的模式都按预期工作了。
这就是我们将在这个初始教程中介绍的全部内容。我们已经成功地设置了一个简单的 GraphQL 服务器,该服务器由内存数据存储支持。
在下一个教程中,我们将研究 GraphQL 突变并更改我们的数据源以使用 SQL 数据库