Uma porta GUI da estrutura de Python para Go. Análise de ancinhos e pães

Com Python, eu tive que trabalhar para sair da desesperança - ML, redes neurais, scripts, era nele que era mais conveniente. Mas o tempo passa e a ansiedade com a velocidade do seu código o empurra para algo mais rápido e confiável.





A tarefa de portar o framework GUI foi dolorosa, porque meu Unigui universal funcionava apenas em Python e era universal apenas em teoria. Uma API extremamente lacônica foi desenvolvida nele, que deveria ter sido preservada na versão Go. Além disso, a massa de automatismo para geração dos dados necessários não foi sujeita a portabilidade, uma vez que Go não tem controle de ordem de compilação, pré-processador, metaprogramação, o que garantiu uma experiência espartana complicada.





A primeira dificuldade que encontrei foi a impossibilidade de atribuir diretamente campos promouted (aninhados) em e apenas no inicializador de estrutura. Se a estrutura tiver uma estrutura aninhada não nomeada, seus campos podem ser acessados ​​da raiz externa em qualquer lugar, exceto para o inicializador. Por causa disso, entre outras coisas, toda a ideia com campos aninhados como com a substituição da hierarquia tornou-se duvidosa e difícil de usar. Exigir que o usuário escreva inicializadores aninhados longos com tipos desnecessários seria o cúmulo da indecência. Todas as estruturas da GUI tornaram-se completamente planas, independentes, embora haja uma hierarquia clara no Python.





, Go , . , - , , , , , “ API”. , , . , , .   . Type_ a Type(…) *Type_. , , Go .





Go Json . nil ( ), nil nil a / [ ] . , — . k, Google, , == nil, = make(0, []Any). , == nil, reflect != nil. reflect.ValueOf(ptr).IsNil() , , true! , ..





hash. . . . . .





, ? , , Any — interface{}. ! ,  100% — . “ , !” 





. , , ( ) , , . , , . , ( ). Google





 MyField int json:"myfield"



, JSON . — - . ? , , — , , . .. !





  Dart _ . , Go Dart- , . . .  , Google , “” . , , , , ?





, map/filter/.. , RemoveAtIndex, , 1.17 , , , .





? ! fmt.Sprintf. - — , , — “ ”.





  .





  • — . , . , , ML- Go… 





  • /. , , Python-a Go — . — , , , . Python - .





  • / — Go. github ( ), . , Visual C++ ~20 , Edit & Continue . , Edit & Continue Go VS Code , , . --. ..





  • . . Go. , . , , , — . 





  • . , Go , 20% . 70% reflect . . , . . 





  • . ( 8000 ) Python Go.





Go:





package main
import . "github.com/Claus1/unigui-go"		

func screenTest(user* User)* Screen_{	
	table := Table("Videos",0, nil, []string{"Video", "Duration",  "Links", "Mine"},
	SeqSeq(Seq("opt_sync1_3_0.mp4", "30 seconds",  "@Refer to signal1", true),
		Seq("opt_sync1_3_0.mp4", "37 seconds",  "@Refer to signal8", false)))
			
	cleanButton := Button("Clean table", nil, "")
	selector := Select("Select", "All", nil, []string{"All","Based","Group"})
	block := Block("X Block", Seq(cleanButton, selector), table)
	block.Icon = "api"
	return Screen(block)	
}
func main(){			
	//register screens
	Register(screenTest, "Main", 0, "insights")	
	Start()
}
      
      



Python:





from unigui import *
name = "Main" #name of screen to show
icon = 'blur_linear' #MD icon of screen to show
order = 0 #order in the program menu
table = Table('Videos', 0, headers = ['Video', 'Duration',  'Links', 'Mine'],rows = [
    ['opt_sync1_3_0.mp4', '30 seconds',  '@Refer to signal1', True],
    ['opt_sync1_3_0.mp4', '37 seconds',  '@Refer to signal8', False]    
])
block = Block('X Block',
    [           
        Button('Clean table'),
        Select('Select', value='All', options=['All','Based','Group'])
    ], table, icon = 'api')
blocks = [block] #what to show on the screen
start('Test app')

      
      



Vou continuar a usar o Go? Onde vou sair do submarino ... e eu realmente quero que Crystal, Nim e outras linguagens simples e avançadas entrem em produção e dêem um pêndulo a Go. Até agora, infelizmente, não vejo alternativa no nicho de produção leve para desenvolvimento de software produtivo. Paz!





Links para os curiosos:





→ Go 





→ Python 








All Articles