golang沒網怎麼開發,golang開源嗎

本文目錄一覽:

如何Golang開發Android應用

環境配置好複雜,我不得不嘮叨幾句。

需要下載golang1.4rc版,下載ndk,然後編譯。 然後用go get 下載gobind這個工具, 然後,將寫好的代碼用gobind轉化下,然後使用特殊的編譯命令,將代碼編譯成.so文件,將生成的相關文件,放到android studio的項目中。然後java代碼中,利用jni調用引用的代碼。

… 好,接着往下看吧。

環境準備

一台Linux 64的機器

一個帶有AndroidStudioIDE的開發機器

因為環境配置實在複雜,所以我們引入的docker。

docker pull codeskyblue/docker-goandroid

docker run –rm -ti codeskyblue/docker-goandroid bash

cd example; echo “view example projects

docker起來之後,什麼就都配置好了,NDK啦,java啦,GO的環境變量了,等等,並且還預裝了vim,gradle,tmux,git,syncthing,svn

開始寫代碼

寫代碼之前,先約定下目錄結構

go的代碼都放在src/golib下,編譯使用make.bash編譯腳本,看下這個文件樹

.

|– app.iml

|– build.gradle

|– libs/armeabi-v7a # go編譯生成的so文件

| `– libgojni.so

|– main.go_tmpl # 一個模板文件,先不用管它

|– make.bash # 編譯腳本,用來生成.so和Java代碼

`– src

|– golib

| |– hi

| | |– go_hi�0�2�0�2�0�2 # 自動生成的代碼

| | | `– go_hi.go

| | `– hi.go # 需要編寫的代碼

| `– main.go

`– main

|– AndroidManifest.xml

|– java

| |– go # 自動生成的代碼

| | |– Go.java

| | |– Seq.java

| | `– hi

| | `– Hi.java

| `– me/shengxiang/gohello # 主要的邏輯代碼

| `– MainActivity.java

`– res

我已經寫了一個例子,先直接搞下來

編譯下,試試行不行(就算不行問題應該也不大,因為大問題都被我消滅了)

cd GoHello/app

./make.bash

../gradlew build

一切順利的話在build/outputs/apk下應該可以看到app-debug.apk這個文件。(劇透下,這個文件只有800多K)

編譯好的我放到qiniu上了,可以點擊下載看看

下面可以嘗試改改,我拋磚引玉說下

打開hi.go這個文件

hi.go的內容,比較簡單,我們寫Go代碼主要就是這部分

// Package hi provides a function for saying hello.

package hi

import “fmt”

func Hello(name string) {

fmt.Printf(“Hello, %s!\n”, name)

return “(Go)World”

}

文件末尾添加下面這行代碼

func Welcome(name string) string {

return fmt.Sprintf(“Welcome %s to the go world”, name)

}

使用./make.bash重新編譯下

打開MainActivity.java 修改下OnClickListener事件

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

String message = Hi.Welcome(“yourname”);

Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();

}

});

編譯運行下,把生成的apk安裝到手機上試試。

原理解讀(有興趣的接着看)

首先說下gobind這個工具。

go_hi/go_hi.go這個文件時通過gobind這個工具生成的,用來配合一個簡單的程序,生成.so文件

// go_hi.go

package go_hi

import (

“golang.org/x/mobile/bind/seq”

“example/hi”

)

func proxy_Hello(out, in *seq.Buffer) {

param_name := in.ReadUTF16()

hi.Hello(param_name)

}

func init() {

seq.Register(“hi”, 1, proxy_Hello)

}

這個簡單的程序內容是這樣的

// main.go

package main

import (

“golang.org/x/mobile/app”

_ “golang.org/x/mobile/bind/java”

_ “example/hi/go_hi”

)

func main() {

app.Run(app.Callbacks{})

}

src/MyActivity.java文件內容是這樣的

import …

import go.Go; // 引入Go這個包

import go.hi.Hi; // gobind生成的代碼

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Go.init(getApplicationContext()); // 初始化兩個線程

Hi.Hello(“world”);

}

}

其中有一句Go.init(…)這裡再看go.Go這個包是什麼樣子的

public final class Go {

// init loads libgojni.so and starts the runtime.

public static void init(Context context) {

… 判斷該函數是否該執行的代碼 — 省略 —

System.loadLibrary(“gojni”); // gojni需要這句

new Thread(“GoMain”) {

public void run() {

Go.run(); // run()是一個native方法

}

}.start();

Go.waitForRun(); // 這個也是一個native方法

// 這部分可以理解為,啟動了一個後台線程不斷的接收結果到緩存中。

new Thread(“GoReceive”) {

public void run() { Seq.receive(); }

}.start();

}

private static boolean running = false;

private static native void run();

private static native void waitForRun();

}

MyActivity.java中還有段代碼是 Hi.Hello(“world”);,打開Hi.java路徑在src/go/hi/Hi.java,這個文件也是gobind生成的,是用來給java方便的調用.so文件

// Hi.java

// File is generated by gobind. Do not edit.

package go.hi;

import go.Seq;

public abstract class Hi {

private Hi() {} // uninstantiable

public static void Hello(String name) {

go.Seq _in = new go.Seq();

go.Seq _out = new go.Seq();

_in.writeUTF16(name);

Seq.send(DESCRIPTOR, CALL_Hello, _in, _out); // 下面接著說

}

private static final int CALL_Hello = 1;

private static final String DESCRIPTOR = “hi”;

}

Seq.send這部分實際上最終調用的是一段go代碼

func Send(descriptor string, code int, req *C.uint8_t, reqlen C.size_t, res **C.uint8_t, reslen *C.size_t) {

fn := seq.Registry[descriptor][code]

in := new(seq.Buffer)

if reqlen 0 {

in.Data = (*[maxSliceLen]byte)(unsafe.Pointer(req))[:reqlen]

}

out := new(seq.Buffer)

fn(out, in)

seqToBuf(res, reslen, out)

}

轉載僅供參考,版權屬於原作者。祝你愉快,滿意請採納哦

怎樣學習GO語言?

golang學習比較簡單,不過任何一門語言都不是孤立存在的,在這裡簡要說明一下golang開發的學習路線

1.golang基礎,包括go語言安裝,go語言語法,流程控制語句,函數,方法,面向對象概念,網絡編程,並發編程等

2.golang開發框架,包括beego,gin,Iris,Echo等

3.微服務開發

4.深入的話還可以學習算法部分。如果要接觸區塊鏈相關技術的話,還需要學習區塊鏈的加密算法等相關知識

5.如果要結合go實現應用的話,肯定離不開各種數據庫,比如關係型數據庫oracle、mysql,或者各類非關係型數據庫等等

6.如果需要開發界面的話,還需要學習網頁編程如html,javascript,vue,elementUI,bootstrap等網頁開發技術和框架。

7.在以上學習的基礎上還可以向架構方面深入學習。

鏈喬教育在線祝您學有所成。

Go語言HTTPServer開發的六種實現

學完了 net/http 和 fasthttp 兩個HTTP協議接口的客戶端實現,接下來就要開始Server的開發,不學不知道一學嚇一跳,居然這兩個庫還支持Server的開發,太方便了。

相比於Java的HTTPServer開發基本上都是使用Spring或者Springboot框架,總是要配置各種配置類,各種 handle 對象。Golang的Server開發顯得非常簡單,就是因為特別簡單,或者說沒有形成特別統一的規範或者框架,我發現了很多實現方式,HTTP協議基於還是 net/http 和 fasthttp ,但是 handle 語法就多種多樣了。

先複習一下: Golang語言HTTP客戶端實踐 、 Golang fasthttp實踐 。

在Golang語言方面,實現某個功能的庫可能會比較多,有機會還是要多跟同行交流,指不定就發現了更好用的庫。下面我分享我學到的六種Server開發的實現Demo。

基於 net/http 實現,這是一種比較基礎的,對於接口和 handle 映射關係處理並不優雅,不推薦使用。

第二種也是基於 net/http ,這種編寫語法可以很好地解決第一種的問題,handle和path有了類似配置的語法,可讀性提高了很多。

第三個基於 net/http 和 github.com/labstack/echo ,後者主要提供了 Echo 對象用來處理各類配置包括接口和handle映射,功能很豐富,可讀性最佳。

第四種依然基於 net/http 實現,引入了 github.com/gin-gonic/gin 的路由,看起來接口和 handle 映射關係比較明晰了。

第五種基於 fasthttp 開發,使用都是 fasthttp 提供的API,可讀性尚可,handle配置倒是更像Java了。

第六種依然基於 fasthttp ,用到了 github.com/buaazp/fasthttprouter ,有點奇怪兩個居然不在一個GitHub倉庫里。使用語法跟第三種方式有點類似,比較有條理,有利於閱讀。

golang 微服務開發(一)

本項目旨在使用golang 搭建一個微服務應用。

gin做api和rpc的客戶端 go-micro作為後台微服務

···

// gin

Frame

– app // 控制器

– conf // 配置文件

– middleward // 中間件

– models // 模型

– routes // 路由

– services // 服務層

– uitl // 工具

– main.go // 入口

// app 目錄

app

– api

– v1

– goods.go

– v2

– route.go

– app.go

//conf目錄

conf

– config.ini

models

– models.go

services

– xxxService.go

util

– config.go

···

如何配置go語言開發環境

1、下載go的zip文件。並且一定要把文件解壓到c:\go目錄下。

2、配置windows的高級環境變量。包括:GOROOT、GOOS、GOBIN、GOARCH。並且在path變量裡面把c:\go\bin加入。以便可以在命令行直接運行go命令。

舉例:我的機器:

GOPATH= c:\go;c:\go\src;F:\workspace\goSample01;

GOBIN=c:\go\bin;F:\workspace\goSample01\bin;

其中,c:\go是go的安裝路徑;

F:\workspace\goSample01是我寫的go語言項目的工程目錄;

F:\workspace\goSample01\bin是go語言項目的工程目錄下的可執行文件路徑;

3、在完成環境變量配置後,打開一個命令行窗口,直接輸入go,然後回車,看看是否出現go的幫助信息。如果出現,那麼go的基本環境就OK了。

注意:這個基本環境不包含開發工具,也不能直接編譯帶C代碼的go程序。

4、(可選)為了支持Import遠程包,最好裝個gomingw。下載地址:。如果下的是壓縮包,請把它解壓到C盤。例如,C:\gowin-env。裡面有個Console.bat是以後使用go get的環境。舉例:有個文件a.go,裡面import(

“fmt”

“github.com/astaxie/beedb”

_ “github.com/ziutek/mymysql/godrv”

為了編譯該a.go文件,需要啟動Console.bat,然後在該命令行窗口,進入c:\go\src目錄下,執行go getgithub.com/astaxie/beedb

Go get github.com/ziutek/mymysql/godrv .

Go會自動下載該遠程包並編譯和安裝這些包。

配置goclipse(可選)

(如果不喜歡eclipse開發工具,請跳過這個配置。)

1、下載並安裝goclipse插件。Goclipse是go語言for eclipse的插件,下載地址:

2、啟動eclipse並創建go項目。然後寫個最簡單的helloworld.go文件,並運行。代碼如下:

packagemainimport”fmt”func main(){ fmt.Printf(“hello, world”)}

配置gocode(可選)

如果不需要go語法輔助和eclipse裡面的(按ALT+/)彈出go語言自動輔助功能,請跳過這個配置。

1、下載gocode的zip文件,解壓後放在go的bin目錄下。

2、下載並安裝Git軟件。並且在path裡面配置git的執行路徑。例如c:\git\bin

3、在命令行執行:go build .\gocode。如果一切正常,那麼將會編譯生成一個gocode.exe文件在go的bin目錄下。如果編譯失敗,那麼就轉第4步。

4、如果第3步直接編譯gocode源文件成功,那就直接到第5步。否則,就需要通過git下載gocode源文件,然後再編譯。在命令行執行:go get -u github.com/nsf/gocode 。就會生成gocode.exe文件。

5、在goclipse插件裡面指定gocode的路徑。就可以在elcipse裡面調用gocode來幫助寫編碼了。

從開發工具這塊看,go語言還不夠成熟,開發工具都還不完善,有待改進。

下載go-tour教程源代碼(可選)

Google有個在線運行go語言的教程(),很不錯。支持在web上直接運行大部分的go程序,想了解這個教程的源代碼的朋友可以通過以下方式獲取。如果沒興趣,可以跳過這個步驟。

1、下載安裝Mercurial軟件。

2、在命令行下輸入:

hg clone

這個URL是我從google的go-tour源代碼的一個clone。作為測試用的。如果把http改成https協議,下載就會失敗。搞不懂。

編譯帶調用C代碼的go文件(可選)

1、為了在windows下編譯帶C代碼的go程序,你首先需要下載並安裝MinGW或者Cygwin。

2、首選安裝MinGW。在安裝MinGW之後,記得要把MinGW安裝目錄\bin路徑設置在path環境變量裡面,以便能在dos窗口下直接調用gcc。

3、下載一個gowin-env。下載地址:gowin-env。下載後解壓到某個目錄下,例如:C:\gowin-env. 然後,編輯go-env.bat。配置相關的go參數。例如,我的配置是:

set GOARCH=386

set GOOS=windows

set GOROOT=c:\go

set GOBIN=%GOROOT%\bin

set GOPATH=%GOROOT%;F:\workspace\goSample01;

設置好go-env.bat後,就可以點擊Console.bat來啟動編譯和運行窗口。

4、編寫一個帶C代碼的go程序。例如,testc.go

5、編譯

例如:

go build -compiler gccgo test_c.go

運行調用C代碼的go文件(可選)

1、testc.go.

創建rand目錄,然後在rand裡面創建testc.go. 代碼如下:

package rand

/*

//

#include stdio.h

*/

import “C”

func PrintHello() {

C.puts(C.CString(“Hello, world\n”))

}

2、a.go

在rand下創建a.go.代碼如下:

package rand

import “fmt”

func SayHello(name string){

fmt.Println(name)

}

3、test_import.go

在rand的上一級創建test_import.go。代碼如下:

package main

import “./rand”

func main(){

rand.SayHello(“tom”)

rand.PrintHello()

}

4、運行test_import.go

go run test_import.go

在測試其它幾個C代碼的時候,發現windows版本的cgo還有些編譯問題,同樣的代碼轉移到蘋果的XCODE下就沒有問題。後來終於發現原因了,原來有些例子是unix平台下的,而在windows平台下,方法名和參數需要做調整。

例如:下面代碼在windows下編譯報一堆錯誤。

package rand

/*

#include stdlib.h

*/

import “C”

func Random() int {

return int(C.random())

}

func Seed(i int) {

C.srandom(C.uint(i))

}

這裡需要把return int(C.random()) 修改為“return int(C.rand())”

C.srandom(C.uint(i))修改為“C.srand(C.uint(i))”編譯就OK了。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/228731.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-10 12:09
下一篇 2024-12-10 12:09

相關推薦

  • 使用Golang調用Python

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

    編程 2025-04-29
  • SDN開源組織中ONOS起步最早

    ONOS是一個開源軟件定義網絡(SDN)操作系統,由ON.Lab創建並一直在開發。該平台旨在通過使用網絡虛擬化技術使工程師能夠快速靈活地創建和管理網絡服務。 一、ONOS的優勢 在…

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

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

    編程 2025-04-29
  • GitHub好玩的開源項目

    本文旨在介紹GitHub上一些好玩的開源項目,並提供代碼示例供讀者參考和學習。 一、Emoji列表 GitHub上有一份完整的Emoji列表,它支持各種平台和設備,方便用戶在Git…

    編程 2025-04-28
  • 雲盤開源系統哪個好?

    本文將會介紹幾種目前主流的雲盤開源系統,從不同方面對它們做出分析比較,以此來確定哪個雲盤開源系統是最適合您的。 一、Seafile Seafile是一款非常出色的雲盤開源系統,它的…

    編程 2025-04-28
  • 開源Python CMS的優勢和應用範圍

    開源Python CMS是一種基於Python架構的內容管理系統。它不僅具有高效可靠的核心框架,還有大量的插件和現成的模板,可以充分滿足各種網站需求,使開發人員輕鬆地進行網站設計和…

    編程 2025-04-28
  • 開源軟件授權使用證明

    開源軟件在現今的軟件開發領域中發揮了非常重要的作用。但是,開源軟件的免費使用並不意味着用戶可以隨意使用,因為開源軟件本身也有授權的問題。本文將從多個方面闡述開源軟件授權使用證明的相…

    編程 2025-04-28
  • Spark開源項目-大數據處理的新星

    Spark是一款開源的大數據分布式計算框架,它能夠高效地處理海量數據,並且具有快速、強大且易於使用的特點。本文將從以下幾個方面闡述Spark的優點、特點及其相關使用技巧。 一、Sp…

    編程 2025-04-27
  • 開源腦電波技術

    本文將會探討開源腦電波技術的應用、原理和示例。 一、腦電波簡介 腦電波(Electroencephalogram,簡稱EEG),是一種用於檢測人腦電活動的無創性技術。它通過在頭皮上…

    編程 2025-04-27
  • Python開源數據集全解析

    Python已經成為了現代編程中最受歡迎的語言之一。它的強大功能、簡單易學的語法和眾多的開源庫,使得Python成為了各行各業開發者群體中需要掌握的技能。Python開源數據集則是…

    編程 2025-04-27

發表回復

登錄後才能評論