golang調用驅動,golang 領域驅動

本文目錄一覽:

go語言postgresql數據庫驅動怎麼用

PostgreSQL和MySQL比較,它更加龐大一點,因為它是用來替代Oracle而設計的。所以在企業應用中採用PostgreSQL是一個明智的選擇。

現在MySQL被Oracle收購之後,有傳聞Oracle正在逐步的封閉MySQL,,鑒於此,將來我們也許會選擇PostgreSQL而不是MySQL作為項目的後端數據庫。

1、驅動

Go實現的支持PostgreSQL的驅動也很多,因為國外很多人在開發中使用了這個數據庫。

支持database/sql驅動,純Go寫的

支持database/sql驅動,純Go寫的

支持database/sql驅動,純Go寫的

在下面的示例中我採用了第一個驅動,因為它目前使用的人最多,在github上也比較活躍。

2、實例代碼

數據庫建表語句:

複製代碼

CREATE TABLE userinfo

(

uid serial NOT NULL,

username character varying(100) NOT NULL,

departname character varying(500) NOT NULL,

Created date,

CONSTRAINT userinfo_pkey PRIMARY KEY (uid)

)

WITH (OIDS=FALSE);

CREATE TABLE userdeatail

(

uid integer,

intro character varying(100),

profile character varying(100)

)

WITH(OIDS=FALSE);

複製代碼

看下面這個Go如何操作數據庫表數據:增刪改查

複製代碼

package main

import (

“database/sql”

“fmt”

_ “github.com/bmizerany/pq”

)

func main() {

db, err := sql.Open(“postgres”, “user=astaxie password=astaxie dbname=test sslmode=disable”)

checkErr(err)

//插入數據

stmt, err := db.Prepare(“INSERT INTO userinfo(username,departname,created) VALUES($1,$2,$3) RETURNING uid”)

checkErr(err)

res, err := stmt.Exec(“astaxie”, “研發部門”, “2012-12-09”)

checkErr(err)

//pg不支持這個函數,因為他沒有類似MySQL的自增ID

id, err := res.LastInsertId()

checkErr(err)

fmt.Println(id)

//更新數據

stmt, err = db.Prepare(“update userinfo set username=$1 where uid=$2”)

checkErr(err)

res, err = stmt.Exec(“astaxieupdate”, 1)

checkErr(err)

affect, err := res.RowsAffected()

checkErr(err)

fmt.Println(affect)

//查詢數據

rows, err := db.Query(“SELECT * FROM userinfo”)

checkErr(err)

for rows.Next() {

var uid int

var username string

var department string

var created string

err = rows.Scan(uid, username, department, created)

checkErr(err)

fmt.Println(uid)

fmt.Println(username)

fmt.Println(department)

fmt.Println(created)

}

//刪除數據

stmt, err = db.Prepare(“delete from userinfo where uid=$1”)

checkErr(err)

res, err = stmt.Exec(1)

checkErr(err)

affect, err = res.RowsAffected()

checkErr(err)

fmt.Println(affect)

db.Close()

}

func checkErr(err error) {

if err != nil {

panic(err)

}

}

複製代碼

從上面的代碼我們可以看到,PostgreSQL是通過$1,$2這種方式來指定要傳遞的參數,而不是MySQL中的?,另外在sql.Open中的dsn信息的格式也與MySQL的驅動中的dsn格式不一樣,所以在使用時請注意它們的差異。

還有pg不支持LastInsertId函數,因為PostgreSQL內部沒有實現類似MySQL的自增ID返回,其他的代碼幾乎是一模一樣

如何在golang 中調用c的靜態庫或者動態庫

Cgo 使得Go程序能夠調用C代碼. cgo讀入一個用特別的格式寫的Go語言源文件, 輸出Go和C程序, 使得C程序能打包到Go語言的程序包中.

舉例說明一下. 下面是一個Go語言包, 包含了兩個函數 — Random 和 Seed — 是C語言庫中random和srandom函數的馬甲.

package rand

/*

#include stdlib.h

*/ import “C” func Random() int { return int(C.random()) } func Seed(i int) { C.srandom(C.uint(i)) }

我們來看一下這裡都有什麼內容. 開始是一個包的導入語句.

rand包導入了”C”包, 但你會發現在Go的標準庫里沒有這個包. 那是因為C是一個”偽包”, 一個為cgo引入的特殊的包名, 它是C命名空間的一個引用.

rand 包包含4個到C包的引用: 調用 C.random和C.srandom, 類型轉換 C.uint(i)還有引用語句.

Random函數調用libc中的random函數, 然後回返結果. 在C中, random返回一個C類型的長整形值, cgo把它輪換為C.long. 這個值必需轉換成Go的類型, 才能在Go程序中使用. 使用一個常見的Go類型轉換:

func Random() int { return int(C.random()) }

這是一個等價的函數, 使用了一個臨時變量來進行類型轉換:

func Random() int { var r C.long = C.random() return int(r) }

Seed函數則相反. 它接受一個Go語言的int類型, 轉換成C語言的unsigned int類型, 然後傳遞給C的srandom函數.

func Seed(i int) { C.srandom(C.uint(i)) }

需要注意的是, cgo中的unsigned int類型寫為C.uint; cgo的文檔中有完整的類型列表.

這個例子中還有一個細節我們沒有說到, 那就是導入語句上面的注釋.

/*

#include stdlib.h

*/ import “C”

Cgo可以識別這個注釋, 並在編譯C語言程序的時候將它當作一個頭文件來處理. 在這個例子中, 它只是一個include語句, 然而其實它可以是使用有效的C語言代碼. 這個注釋必需緊靠在import “C”這個語句的上面, 不能有空行, 就像是文檔注釋一樣.

Strings and things

與Go語言不同, C語言中沒有顯式的字符串類型. 字符串在C語言中是一個以0結尾的字符數組.

Go和C語言中的字符串轉換是通過C.CString, C.GoString,和C.GoStringN這些函數進行的. 這些轉換將得到字符串類型的一個副本.

下一個例子是實現一個Print函數, 它使用C標準庫中的fputs函數把一個字符串寫到標準輸出上:

package print // #include stdio.h // #include stdlib.h import “C” import “unsafe” func Print(s string) { cs := C.CString(s) C.fputs(cs, (*C.FILE)(C.stdout)) C.free(unsafe.Pointer(cs)) }

在C程序中進行的內存分配是不能被Go語言的內存管理器感知的. 當你使用C.CString創建一個C字符串時(或者其它類型的C語言內存分配), 你必需記得在使用完後用C.free來釋放它.

調用C.CString將返回一個指向字符數組開始處的指錯, 所以在函數退出前我們把它轉換成一個unsafe.Pointer(Go中與C的void 等價的東西), 使用C.free來釋放分配的內存. 一個慣用法是在分配內存後緊跟一個defer(特別是當這段代碼比較複雜的時候), 這樣我們就有了下面這個Print函數:

func Print(s string) { cs := C.CString(s) defer C.free(unsafe.Pointer(cs)) C.fputs(cs, (*C.FILE)(C.stdout)) }

構建 cgo 包

如果你使用goinstall, 構建cgo包就比較容易了, 只要調用像平常一樣使用goinstall命令, 它就能自動識別這個特殊的import “C”, 然後自動使用cgo來編譯這些文件.

如果你想使用Go的Makefiles來構建, 那在CGOFILES變量中列出那些要用cgo處理的文件, 就像GOFILES變量包含一般的Go源文件一樣.

rand包的Makefile可以寫成下面這樣:

include $(GOROOT)/src/Make.inc

TARG=goblog/rand

CGOFILES=\ rand.go\ include $(GOROOT)/src/Make.pkg

然後輸入gomake開始構建.

更多 cgo 的資源

cgo的文檔中包含了關於C偽包的更多詳細的說明, 以及構建過程. Go代碼樹中的cgo的例子給出了更多更高級的用法.

一個簡單而又符合Go慣用法的基於cgo的包是Russ Cox寫的gosqlite. 而Go語言的網站上也列出了更多的的cgo包.

最後, 如果你對於cgo的內部是怎麼運作這個事情感到好奇的話, 去看看運行時包的cgocall.c文件的注釋吧.

golang調用DLL中的函數

在golang中加載dll並調用函數流程如下:

1.加載dll動態庫到內存 syscall.LoadLibrary

2.獲取函數地址 syscall.GetProcAddress

3.執行系統調用,傳入參數 syscall.Syscall6

一個系統消息框函數的調用示例:

原創文章,作者:ZYNN,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/139142.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ZYNN的頭像ZYNN
上一篇 2024-10-04 00:22
下一篇 2024-10-04 00:22

相關推薦

  • 使用Golang調用Python

    在現代軟件開發中,多種編程語言的協作是相當普遍的。其中一種使用場景是Golang調用Python,這使得在使用Python庫的同時,可以利用Golang的高性能和強大並發能力。這篇…

    編程 2025-04-29
  • Python在化學領域的應用

    Python作為一種強大的編程語言,其應用已經遍布各個領域,包括了化學。在化學研究中,Python不僅可以完成數據處理和可視化等任務,還可以幫助化學家們進行計算、建模和仿真等工作。…

    編程 2025-04-29
  • 使用Golang創建黑色背景圖片的方法

    本文將從多個方面介紹使用Golang創建黑色背景圖片的方法。 一、安裝必要的代碼庫和工具 在開始創建黑色背景圖片之前,我們需要先安裝必要的代碼庫和工具: go get -u git…

    編程 2025-04-29
  • 如何提高自己在編程領域的技能水平

    作為一個編程開發工程師,在不斷學習、提高自己的技能水平是必不可少的。本文將從多個方面,分享一些提高編程技能的方法和建議。 一、積累實踐經驗 編程領域是一個需要經驗積累的領域。可以通…

    編程 2025-04-27
  • Python在汽車領域的應用

    Python作為一種高級編程語言,其強大的數據分析能力和豐富的開源庫使其在各個行業得到了廣泛的應用。在汽車領域,Python也逐漸成為一個非常有價值的工具,可以用於汽車領域中的大量…

    編程 2025-04-25
  • 探索Market1501——視覺監測領域的重要數據集

    一、介紹Market1501 Market1501是一個用於人類重識別領域的數據集,由清華大學研究員李康等人在2015年發佈。其由1501個行人的12936張圖像組成,採集自天津市…

    編程 2025-04-24
  • NLP領域的多方位探索

    一、文本分類 文本分類是NLP領域中的一個重要任務,它的目的是自動將文本分配到不同的預定義類別中。文本分類技術可以在廣泛的領域中應用,例如情感分析、輿情監測等。 文本分類的一種常見…

    編程 2025-04-24
  • Golang中使用strings.Split函數進行字符串分割的方法

    一、Split函數的基本用法 字符串是編程中常見的數據類型,它們可以在程序中被處理、存儲和傳輸。在Go語言中,字符串也是一個基本的數據類型,而strings包提供了一些操作字符串的…

    編程 2025-04-23
  • 深入下探golang http server

    Go語言已經成為了軟件開發領域的熱門語言,它的高性能、應用廣泛、安全性好,使得它成為了眾多開發者心目中的首選編程語言。在眾多應用場景中,golang http server的應用非…

    編程 2025-04-23
  • Golang環境變量全面解析

    Golang是一門非常流行的開發語言,擁有高效的CGO、簡單易懂的語法、高並發能力等優點,然而它也需要使用環境變量來配置一些參數。在本篇文章中,我們將從多個方面對Golang環境變…

    編程 2025-04-23

發表回復

登錄後才能評論